routes/index.js 里。
如果你看到了
{
"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) => {









