最近由于需要用Node.js开发微信支付模块,顺便写一下微信支付的过程。首先要安装Node.js,npm, Express,模板引擎用EJS或者Pug(Jade),我选择简洁风格的EJS,个人不喜欢Pug(Jade)的语法。用express-generator生成完工程以后就可以开始了。微信支付接口文档可以在微信商户平台开发者文档找到。npm上的weixin-pay或者node-weixin-pay可以支持微信支付。
一:介绍
微信支付流程可以参考微信商户平台开发者文档,一共有四种支付方式刷卡支付,公众号支付,扫码支付,App支付,我们要用的是公众号支付和扫码支付。先来实现扫码支付。
二:扫码支付
商户支付回掉URL,生成二维码规则形式为
weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
其中XXXXX为商户需要填写的内容,可以参考官方的生成二维码规则
1: 调用函数
function onBridgeReady() {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": "wx2421b1c4370ec43b", // 公众号名称,由商户传入
"timeStamp": " 1395712654", // 时间戳,自1970年以来的秒数
"nonceStr": "e61463f8efa94090b1f366cccfbbb444", // 随机串
"package": "prepay_id=u802345jgfjsdfgsdg888",
"signType": "MD5", // 微信签名方式
"paySign": "70EA570631E4BB79628FBCA90534C63FF7FADD89" // 微信签名
},
function(res) {
// 使用以上方式判断前端返回,微信团队郑重提示:
// res.err_msg将在用户支付成功后返回
// ok,但并不保证它绝对可靠。
if (res.err_msg == "get_brand_wcpay_request: ok" ) {
;
}
});
}
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
} else {
onBridgeReady();
}
2: 返回JSON
{
"appId": "wx2421b1c4370ec43b", // 公众号名称,由商户传入
"timeStamp":" 1395712654", // 时间戳,自1970年以来的秒数
"nonceStr": "e61463f8efa94090b1f366cccfbbb444", // 随机串
"package": "prepay_id=u802345jgfjsdfgsdg888",
"signType": "MD5", // 微信签名方式:
"paySign": "70EA570631E4BB79628FBCA90534C63FF7FADD89" // 微信签名
}
3: 输入XML
<xml>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<attach><![CDATA[支付测试]]></attach>
<bank_type><![CDATA[CFT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
<openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
<out_trade_no><![CDATA[1409811653]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
<sub_mch_id><![CDATA[10000100]]></sub_mch_id>
<time_end><![CDATA[20140903131540]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>
4: 支付成功