UNPKG

@jinyexin/wechat

Version:

A simple wechat server lib

2 lines 17.8 kB
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("wechat",[],t):"object"==typeof exports?exports.wechat=t():e.wechat=t()}(global,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)n.d(r,s,function(t){return e[t]}.bind(null,s));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(3);t.wechatXMLMessage=class{toXMLString(){let e={};for(let t in this)"function"!=typeof this[t]&&(e[t]={$t:this[t]});let t={xml:e};return r.toXml(t)}}},function(e,t){e.exports=require("@jinyexin/core")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(1);!function(e){let t=n(19),s=n(20),o=n(21),a="",i=new Date,c="",u=new Date;function l(){let e=new Date;return new Promise((t,n)=>{if(""===a||e.getTime()-i.getTime()>=global.config.wechat.tokenTimeout){r.logger.debug("renew wechat access token..."),g({method:"GET",path:`/cgi-bin/token?grant_type=client_credential&appid=${global.config.wechat.appID}&secret=${global.config.wechat.appsecret}`},null,e=>{try{let s=JSON.parse(e);s.access_token&&(a=s.access_token,i=new Date,r.logger.debug(`new wechat access token:${a}`),t(a))}catch(e){r.logger.error(`wechat token parse error${e}`),n(e)}},e=>{r.logger.error(`fail to get new token, err:${e}`),n(e)},!1)}else r.logger.debug("reuse wechat access token..."),t(a)})}function g(e,t,n,o,a=!0){(a?l:()=>Promise.resolve(""))().then(i=>{e.method||(e.method="GET"),e.hostname||(e.hostname="api.weixin.qq.com"),e.port=443,a&&(e.path+="?access_token="+i),r.logger.debug(`sending wechat request with options:${JSON.stringify(e)}`),t&&r.logger.debug(`sending data to wechat:${t}`);let c=s.request(e,e=>{let t="";e.on("data",e=>{t+=e}),e.on("end",()=>{n(t)})}).on("error",e=>{o(e)});t?c.end(t):c.end()})}function d(){return Math.random().toString(36).substr(2,15)}function p(){return Math.floor((new Date).getTime()/1e3)}function h(e,t=!0,n=!0){let r=Object.keys(e);t&&(r=r.sort());let s={};r.forEach(function(t){const r=n?t.toLowerCase():t;s[r]=e[t]});let o="";for(let e in s)o+="&"+e+"="+s[e];return o=o.substr(1)}e.checkWechatSignature=function(e,n,r,s){let o=[s,n,r];o.sort();let a=o.join(""),i=t.createHash("sha1");return i.update(a),i.digest("hex")===e},e.sign=function(e,n){let r=d(),s=p(),o=h({jsapi_ticket:e,nonceStr:r,timestamp:s,url:n}),a=t.createHash("sha1");return a.update(o),{nonceStr:r,timestamp:s,signature:a.digest("hex")}},e.signObject=function(e){let n=h(e,!0,!1)+"&key="+global.config.wechat.key;return r.logger.debug(`sign string:${n}`),t.createHash("md5").update(n).digest("hex").toUpperCase()},e.getAccessToken=l,e.getJSAPITicket=function(){let e=new Date;return new Promise((t,n)=>{""===c||e.getTime()-u.getTime()>=global.config.wechat.tokenTimeout?(r.logger.debug("renew wechatjsapi ticket token..."),l().then(e=>{g({hostname:"api.weixin.qq.com",port:443,method:"GET",path:`/cgi-bin/ticket/getticket?access_token=${e}&type=jsapi`},null,e=>{try{let s=JSON.parse(e);s.ticket?(c=s.ticket,u=new Date,r.logger.debug(`new jsapi ticket:${c}`),t(c)):(r.logger.error(`wechat jsapi ticket format error:${s}`),n("format error"))}catch(e){r.logger.error(`wechat jsapi ticket parse error${e}`),n(e)}},e=>{r.logger.error(`fail to get new jsapi ticket, err:${e}`),n(e)},!1)})):(r.logger.debug("reuse jsapi ticker token..."),t(c))})},e.getWebAccessToken=function(e){return new Promise((t,n)=>{r.logger.debug("get wechat web access token..."),g({method:"GET",path:`/sns/oauth2/access_token?appid=${global.config.wechat.appID}&secret=${global.config.wechat.appsecret}&code=${e}&grant_type=authorization_code`},null,e=>{try{r.logger.debug(`wechat web access token result:${e}`);let s=JSON.parse(e);s.access_token?t(s):(r.logger.error(`wechat web token error${s}`),n("fail to get access token from response!"))}catch(e){r.logger.error(`wechat web token parse error${e}`),n(e)}},e=>{r.logger.error(`fail to get new web token, err:${e}`),n(e)},!1)})},e.sendWechatRequest=g,e.sendHTTPRequest=function(e,t,n,s,a=!0){r.logger.debug(`sending http request with options:${JSON.stringify(e)}`),t&&r.logger.debug(`sending data:${t}`);let i=o.request(e,e=>{let t="";e.on("data",e=>{t+=e}),e.on("end",()=>{n(t)})}).on("error",e=>{s(e)});t?i.end(t):i.end()},e.createNonceStr=d,e.createTimestamp=p,e.raw=h,e.checkLocalhost=function(e,t,n){let s=e.headers["x-real-ip"]||e.ip;r.logger.debug(`getting transfer request from ip:${s}`),"::1"===s||"127.0.0.1"===s||"::ffff:127.0.0.1"===s?(r.logger.debug("pass localhost check"),n()):(r.logger.error(`${s} is trying to access that only open to localhost!!!`),t.status(500).end("access deny"))}}(t.wechatUtils||(t.wechatUtils={}))},function(e,t){e.exports=require("xml2json")},function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(12)),r(n(13)),r(n(8)),r(n(14)),r(n(15)),r(n(16)),r(n(0)),r(n(17)),r(n(5)),r(n(18))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.wechatJSONMessage=class{}},function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(11)),r(n(4)),r(n(2)),r(n(10)),r(n(9)),r(n(7))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(8),s=n(9),o=n(2),a=n(1);t.defaultHandler=class extends s.abstractHandler{handleTextMessage(e,t){return t.Content="欢迎互动",t}handleEventSubscribeMessage(e,t){return t.Content="欢迎加入",t}handelPayMessage(e){let t=global.config,n=new r.payResponseMessage,s={hostname:t.domainServer,port:t.domainPort,path:t.domainOrderAPI+"/"+e.out_trade_no,method:"PUT",headers:{"Content-Type":"application/json"}};return new Promise((e,t)=>{o.wechatUtils.sendHTTPRequest(s,null,t=>{a.logger.debug(`get data from domain server:${t}`),n.return_code="SUCCESS",e(n)},t=>{n.return_code="FAIL",n.return_msg=JSON.stringify(t),a.logger.error(JSON.stringify(t)),e(n)})})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(0);t.payResponseMessage=class extends r.wechatXMLMessage{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(3),s=n(4),o=n(1),a=n(2);t.abstractHandler=class{handleSignature(e,t){let n=e.query.signature,r=e.query.timestamp,s=e.query.nonce,i=e.query.echostr;a.wechatUtils.checkWechatSignature(n,r,s,global.config.wechat.token)?(o.logger.debug("check wechat signature success!"),t.end(i)):(o.logger.error("check wechat signature fail!"),t.end("invalid request"))}handleRequest(e,t){try{let n=JSON.parse(r.toJson(e.body)).xml;o.logger.debug(`acquire message from wechat:${JSON.stringify(n)}`),t.writeHead(200,{"Content-Type":"application/xml"});let a=new s.textMessage;if(a.ToUserName=n.FromUserName,a.FromUserName=n.ToUserName,a.CreateTime=Math.floor((new Date).getTime()/1e3),a.Content=`DEBUG:尚未处理的消息类型:MsgType[${n.MsgType}]`,"text"===n.MsgType)a=this.handleTextMessage(n,a);else if("event"===n.MsgType){let e=n;a.Content+=`,Event[${e.Event}]`,"subscribe"===e.Event&&(a=this.handleEventSubscribeMessage(e,a))}o.logger.debug(`send response:${JSON.stringify(a)}`),t.end(a.toXMLString())}catch(e){o.logger.error(e),t.end("")}}handlePayRequest(e,t){let n=JSON.parse(r.toJson(e.body)).xml;o.logger.debug(`acquire pay from wechat:${JSON.stringify(n)}`),t.writeHead(200,{"Content-Type":"application/xml"}),this.handelPayMessage(n).then(e=>{o.logger.debug(`send pay response:${JSON.stringify(e)}`),t.end(e.toXMLString())},e=>{o.logger.error(e);let n=new s.payResponseMessage;n.return_code="FAIL",n.return_msg=e,o.logger.error(`send pay failed response:${JSON.stringify(n)}`),t.end(n.toXMLString())})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(4),s=n(6),o=n(3),a=n(1);let i=n(22);t.wechatService=class{static sendTemplateMessage(e){return e.url||(e.url=`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${global.config.wechat.appID}`+"&redirect_uri="+e.redirect_uri+"&response_type=code&scope=snsapi_userinfo&state="+e.state+"#wechat_redirect"),delete e.redirect_uri,delete e.state,new Promise((t,n)=>{let r={method:"POST",path:"/cgi-bin/message/template/send",headers:{"Content-Type":"application/json"}};s.wechatUtils.sendWechatRequest(r,JSON.stringify(e),e=>{t(e)},e=>{n(e)})})}static pushMenu(e){return new Promise((t,n)=>{let r={method:"POST",path:"/cgi-bin/menu/create",headers:{"Content-Type":"application/json"}};s.wechatUtils.sendWechatRequest(r,JSON.stringify(e),e=>{t(e)},e=>{n(e)},!0)})}static transfer(e,t,n){let c=new r.transferMessage;return c.mch_appid=global.config.wechat.appID,c.mchid=global.config.wechat.mch_id,c.device_info="WEB",c.nonce_str=s.wechatUtils.createNonceStr(),c.partner_trade_no=n,c.openid=e,c.check_name="NO_CHECK",c.amount=t,c.desc="提现",c.spbill_create_ip="14.23.150.211",c.sign=s.wechatUtils.signObject(c),new Promise((e,t)=>{let n={method:"POST",hostname:"api.mch.weixin.qq.com",path:"/mmpaymkttransfers/promotion/transfers",headers:{"Content-Type":"application/xml"},key:i.readFileSync(global.config.wechat.ssl_key),cert:i.readFileSync(global.config.wechat.ssl_cert),agent:!1};s.wechatUtils.sendWechatRequest(n,c.toXMLString(),t=>{a.logger.debug(`transfer result ${JSON.stringify(t)}`),e(JSON.parse(o.toJson(t)))},e=>{t(e)},!1)})}static getWebAccessToken(e){return s.wechatUtils.getWebAccessToken(e)}static getSignature(e){return s.wechatUtils.getJSAPITicket().then(t=>s.wechatUtils.sign(t,e))}static getPaySign(e){return s.wechatUtils.signObject(e)}static getUserByWebToken(e,t){return new Promise((n,r)=>{let o={path:`/sns/userinfo?access_token=${e}&openid=${t}&lang=zh_CN`,headers:{"Content-Type":"application/json"}};s.wechatUtils.sendWechatRequest(o,null,e=>{n(e)},e=>{r(e)},!1)})}static createUnifiedOrder(e){let t=new r.unifiedorder;return t.attach=e.attach,t.body=e.body,t.detail=e.detail,t.openid=e.openid,t.out_trade_no=e.out_trade_no,t.spbill_create_ip=e.spbill_create_ip,t.total_fee=e.total_fee,t.device_info="WEB",t.appid=global.config.wechat.appID,t.mch_id=global.config.wechat.mch_id,t.nonce_str=s.wechatUtils.createNonceStr(),t.notify_url=global.config.wechat.notify_url,t.trade_type="JSAPI",t.sign=s.wechatUtils.signObject(t),new Promise((e,n)=>{let r={method:"POST",hostname:"api.mch.weixin.qq.com",path:"/pay/unifiedorder"};s.wechatUtils.sendWechatRequest(r,t.toXMLString(),t=>{a.logger.debug(`unifiedorder result ${JSON.stringify(t)}`),e(JSON.parse(o.toJson(t)))},e=>{n(e)},!1)})}}},function(e,t,n){"use strict";var r=this&&this.__decorate||function(e,t,n,r){var s,o=arguments.length,a=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var i=e.length-1;i>=0;i--)(s=e[i])&&(a=(o<3?s(a):o>3?s(t,n,a):s(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a},s=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0});const o=n(1),a=n(7),i=n(10),c=n(2);let u=class{constructor(){this.handler=new a.defaultHandler}async transfer(e,t){let n=JSON.parse(e.body);return i.wechatService.transfer(n.openid,n.amount,n.trade_no).then(e=>e.xml)}async pay(e,t,n){return this.handler.handlePayRequest(e,t)}async unifiedOrder(e,t,n){let r=JSON.parse(e.body);return r.spbill_create_ip=e.headers["x-real-ip"]||e.connection.remoteAddress,o.logger.warn(`get real ip for unifiedorder, result is:${r.spbill_create_ip}`),i.wechatService.createUnifiedOrder(r).then(e=>e.xml)}async checkSignature(e,t,n){return this.handler.handleSignature(e,t)}async getMessage(e,t,n){return this.handler.handleRequest(e,t)}async sendTemplateMessage(e,t,n){return i.wechatService.sendTemplateMessage(JSON.parse(e.body))}signature(e,t,n){return i.wechatService.getSignature(e.query.url).then(e=>{e.appID=global.config.wechat.appID,t.json(e)})}async paySign(e,t,n){return{paySign:i.wechatService.getPaySign(JSON.parse(e.body))}}auth_userinfo(e,t,n){let r=e.query.code,s=e.query.state;if(r&&s)return i.wechatService.getWebAccessToken(r).then(e=>i.wechatService.getUserByWebToken(e.access_token,e.openid)).then(e=>{let n=JSON.parse(e);o.logger.debug(`user:${JSON.stringify(n)}`),t.jsonp(n)}).catch(e=>{t.end(e)});throw new o.serviceException("missing code or state!",400)}async auth(e,t,n){let r=e.query.code,s=e.query.state;if(r&&s){return{openid:(await i.wechatService.getWebAccessToken(r)).openid}}throw new o.serviceException("missing code or state!",400)}authAndRegister(e,t,n){let r=e.query.code,s=e.query.state;if(r&&s)return i.wechatService.getWebAccessToken(r).then(e=>i.wechatService.getUserByWebToken(e.access_token,e.openid)).then(e=>{let n=JSON.parse(e),r=global.config,a={hostname:r.domainServer,port:r.domainPort,path:r.domainWechatLoginUrl,method:"POST",headers:{"Content-Type":"application/json"}};o.logger.debug(`user:${JSON.stringify(n)}`),c.wechatUtils.sendHTTPRequest(a,JSON.stringify({open_id:n.openid,nickname:n.nickname,sex:n.sex,city:n.city,province:n.province,country:n.country,headimgurl:n.headimgurl}),e=>{o.logger.debug(`get login data from domain server:${e}, redirect to web:${r.webServer}/${r.webloginurl}/${JSON.parse(e).token};id=${JSON.parse(e).id};state=${s}`),t.redirect(`http://${r.webServer}/${r.webloginurl}/${JSON.parse(e).token};id=${JSON.parse(e).id};state=${s}`)},e=>{t.end(JSON.stringify(e))})}).catch(e=>{t.end(e)});throw new o.serviceException("missing code or state!",400)}};r([o.Post({url:"/transfer",auth:!1,callbacks:[c.wechatUtils.checkLocalhost]}),s("design:type",Function),s("design:paramtypes",[Object,Object]),s("design:returntype",Promise)],u.prototype,"transfer",null),r([o.Post({url:"/pay",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",Promise)],u.prototype,"pay",null),r([o.Post({url:"/unifiedorder",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",Promise)],u.prototype,"unifiedOrder",null),r([o.Get({url:"/",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",Promise)],u.prototype,"checkSignature",null),r([o.Post({url:"/",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",Promise)],u.prototype,"getMessage",null),r([o.Post({url:"/templateMessage",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",Promise)],u.prototype,"sendTemplateMessage",null),r([o.Get({url:"/signature",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",void 0)],u.prototype,"signature",null),r([o.Post({url:"/paySign",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",Promise)],u.prototype,"paySign",null),r([o.Get({url:"/auth_userinfo",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",void 0)],u.prototype,"auth_userinfo",null),r([o.Get({url:"/auth",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",Promise)],u.prototype,"auth",null),r([o.Get({url:"/authAndRegister",auth:!1}),s("design:type",Function),s("design:paramtypes",[Object,Object,Object]),s("design:returntype",void 0)],u.prototype,"authAndRegister",null),u=r([o.Controller("")],u),t.WechatController=u},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(0);t.eventMessage=class extends r.wechatXMLMessage{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(0);t.payMessage=class extends r.wechatXMLMessage{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(0);t.textMessage=class extends r.wechatXMLMessage{constructor(){super(...arguments),this.MsgType="text"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(0);t.transferMessage=class extends r.wechatXMLMessage{constructor(){super(...arguments),this.check_name="NO_CHECK"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(0);t.unifiedorder=class extends r.wechatXMLMessage{constructor(){super(...arguments),this.trade_type="JSAPI"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(5);t.templateMessage=class extends r.wechatJSONMessage{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(5);t.menuCreateMessage=class extends r.wechatJSONMessage{};t.wechatMenuButton=class{}},function(e,t){e.exports=require("crypto")},function(e,t){e.exports=require("https")},function(e,t){e.exports=require("http")},function(e,t){e.exports=require("fs")}])}); //# sourceMappingURL=wechat.min.js.map