如果你看到了
{ "title": "koa2 json" }
就说明没问题。(如果有问题,检查一下是不是端口被占用了等等。)
接下来在 routes
文件夹里我们新建一个 wechatpay.js
的文件用来书写我们的流程。
签名
跟微信的服务器交流很关键的一环是签名必须正确,如果签名不正确,那么一切都白搭。
首先我们需要去公众号的后台获取我们所需要的如下相应的id或者key的信息。其中 notify_url
和 server_ip
是用于当我们支付成功后,微信会主动往这个url post
支付成功的信息。
签名算法如下:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3
为了签名正确,我们需要安装一下 md5
。
npm install md5 --save #or yarn add md5
const md5 = require('md5') const appid = 'xxx' const mch_id = 'yyy' const mch_api_key = 'zzz' const notify_url = 'http://xxx/api/notify' // 服务端可访问的域名和接口 const server_ip = 'xx.xx.xx.xx' // 服务端的ip地址 const trade_type = 'NATIVE' // NATIVE对应的是二维码扫码支付 let body = 'XXX的充值支付' // 用于显示在支付界面的提示词
然后开始写签名函数:
const signString = (fee, ip, nonce) => { let tempString = `appid=${appid}&body=${body}&mch_id=${mch_id}&nonce_str=${nonce}¬ify_url=${notify_url}&out_trade_no=${nonce}&spbill_create_ip=${ip}&total_fee=${fee}&trade_type=${trade_type}&key=${mch_api_key}` return md5(tempString).toUpperCase() }
其中 fee
是要充值的费用,以分为单位。比如要充值1块钱, fee
就是100。ip是个比较随意的选项,只要符合规则的ip经过测试都是可以的,下文里我用的是 server_ip
。 nonce
就是微信要求的不重复的32位以内的字符串,通常可以使用订单号等唯一标识的字符串。
由于跟微信的服务器交流都是用xml来交流,所以现在我们要手动组装一下post请求的 xml
:
const xmlBody = (fee, nonce_str) => { const xml = ` <xml> <appid>${appid}</appid> <body>${body}</body> <mch_id>${mch_id}</mch_id> <nonce_str>${nonce_str}</nonce_str> <notify_url>${notify_url}</notify_url> <out_trade_no>${nonce_str}</out_trade_no> <total_fee>${fee}</total_fee> <spbill_create_ip>${server_ip}</spbill_create_ip> <trade_type>NATIVE</trade_type> <sign>${signString(fee, server_ip, nonce_str)}</sign> </xml> ` return { xml, out_trade_no: nonce_str } }
内容版权声明:除非注明,否则皆为本站原创文章。