この記事では、主にnodejs WeChatパブリックアカウント決済の開発について詳しく紹介します。興味のある友人は参考にしてください
odeJs WeChatパブリックアカウント機能の開発、モバイルH5ページはWeChat決済機能を呼び出します。過去数日間、支払い要件を完了するための企業のニーズに応じて、node ページと h5 ページを使用して WeChat の支払い機能が呼び出されてきました。ここで、より多くの開発者が WeChat 決済機能の開発を正常に完了できるように、開発プロセスをもう一度見てみましょう。 (WeChat はまだノード決済機能を提供していません)
1. コードをリクエストする
コードをリクエストする目的は、ユーザーの openid (現在の公式アカウントに対するユーザーの一意の識別子) とリクエストされた API である access_token を取得することです。 : open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
この API は、いくつかのパラメーターに注意する必要があります:
1. appid パブリック アカウント appid、公式アカウントで確認できます
2. redirect_uri カスタマイズされた WeChat コールバック アドレス。コードを使用して、WeChat は定義した redirect_uri のアドレスにジャンプします。ここでの redirect_url には * *url_encode* が必要です。 * *php*、プログラムがノードの場合、**encodeURLComponent(url)** エンコーディングを使用する必要があります
3。response_type=code、これについては何も言うことはありません。詳細については、これは単なる固定の response_type=code です。手順については、WeChat 公式 Web サイトの手順を確認してください。
4. Scope=snsapi_userinfo、次のように記述します。詳細な手順については、WeChat 公式 Web サイトの手順を確認してください。
5.詳細な手順については、WeChat 公式 Web サイトの手順を確認してください。 6. wechat_redirect: このように修正しました。 詳細な手順については、WeChat の公式 Web サイトの手順を確認してください
最初のステップはコードの値を取得することであり、次にコードを通じて取得する必要があります access_token、openid、要求された API の値を取得します
APIapi.weixin.qq .com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
ここでの API のパラメーターの説明:
1. appid WeChat 公式アカウントの背景から取得された WeChat 公式アカウントのシークレット
3. コード、最初のステップは、使用するコードを取得することです
3.
後続の機能を実行するには、access_token から access_token を使用します。公式の例を参照できます:
open.weixin.qq.com/cgi-bin/showdocument
?action= dir_list&t=resource/ res_list&verify=1&id=open1419316518&lang=zh_CN4. Web ページで支払い API を起動します
これを見ると、呼び出すだけでほぼ完了したように感じます。 Web ページ上の WeChat 支払い機能?いいえ、閉じてもいません WeChat ブラウザで H5 Web ページを開き、JS を実行して支払いを有効にします。インターフェースの入出力データ形式は
JSONです。
注: WeixinJSBridge の組み込み オブジェクトは、他のブラウザでは無効です。
サンプルコードは次のとおりです: function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
"paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 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();
}
{ "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 "package" : "prepay_id=u802345jgfjsdfgsdg888", "signType" : "MD5", //微信签名方式: "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 }
パラメータの説明:
1.マーチャントによって渡されたアカウント名2 . timeStamp //タイムスタンプ、1970 年からの秒数。ここでは特別な注意を払う必要があります。これは、
string のタイムスタンプ形式である必要があります。つまり、「」である必要があります。 " 引用符
3. nonceStr // 32 ビットのランダムな文字列 はい、メソッドは後で提供されます 4.signType // WeChat 署名メソッド: MD5 5. paySign // WeChat 署名、その後
6. **パッケージ** // これが最も重要です。どこで入手しましたか? 次。
追記: 公式ウェブサイトのインターフェースの説明
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
5. パッケージを取得します
公式API:
api.mch.weixin.qq.com/pay/unifiedord 请求参数一堆, 但是有一些不是必须的,下面是必须参数 微信的统一下单接口要求传递的是 xml 的数据, 而且数据还需要签名, 那么首先吧数据签名。 生成签名后需要吧数据组装为xml 的格式: 接下来就是请求 api 获取prepay_id的值了, 将上面得到的 xml 数据请求下面的 api 发送给微信, 微信验证数据没问题后会放回你想要的值。 六. 获取到了prepay_id是不是就可以在 h5 段直接调用微信的支付了么? 答案是还不可以。 获取到了prepay_id那么现在h5 呼起微信的支付功能的参数是这样的: 有了这样的参数, 那么你还需要吧所有参与的参数做签名。签名规跟上面的一样,生成了签名后需要吧签名的参数 paySign 赋给h5 呼起微信的支付功能的参数(也就是微信的签名不参与签名的生成) 如果你的各个环节都没有问题, 那么得到了这样参数后你就可以正常的调用起微信的支付功能, 跟原生的功能是没有任何的差别的,(估计你现在的心里也特高兴吧, 没有 app 竟然可以使用 app 的功能,就是这么的神奇)。 七.支付完成的回调 微信支付完了后会在 h5 页面的微信支付的回调函数里面放回值, 根据自己的业务逻辑解析这个 xml 格式的数据就好了。 小坑:node ,express 框架开发, 如果你在微信的支付成功后的回调中没有获取到任何 xml 的值, 那么你需要安装一组件:body-parser-xml, 你可以使用 npm install body-parser-xml --save 安装, 在 app.js 里面require('body-parser-xml')(bodyParser);,使用中间件的方式 这样你就可以正常的获取到微信的 xml 数据了。 使用方法: 就到这里吧, 感觉也差不多了。如有不对的地方还请指正。 【相关推荐】 1. 特别推荐:“php程序员工具箱”V0.1版本下载 2. 微信小程序完整源码
er{
appid : APPID,
attach : ATTACH,
body : BODY,
mch_id : MCH_ID,
nonce_str: NONCE_STR,
notify_url : NOTIFY_URL,// 微信付款后的回调地址
openid : OPENID,
out_trade_no : OUT_TRADE_NO ,//new Date().getTime(), //订单号
spbill_create_ip : SPBILL_CREATE_IP , //客户端的 ip
total_fee : TOTAL_FEE, //商品的价格, 此处需要注意的是这个价格是以分算的, 那么一般是元, 你需要转换为 RMB 的元
trade_type : 'JSAPI',
}
签名规则可以参考微信给出的签名规则(签名方法一会给出)
微信官方签名规则:
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3var body = '<xml> ' +
'<appid>'+config.wxappid+'</appid> ' +
'<attach>'+obj.attach+'</attach> ' +
'<body>'+obj.body+'</body> ' +
'<mch_id>'+config.mch_id+'</mch_id> ' +
'<nonce_str>'+obj.nonce_str+'</nonce_str> ' +
'<notify_url>'+obj.notify_url+'</notify_url>' +
'<openid>'+obj.openid+'</openid> ' +
'<out_trade_no>'+obj.out_trade_no+'</out_trade_no>'+
'<spbill_create_ip>'+obj.spbill_create_ip+'</spbill_create_ip> ' +
'<total_fee>'+obj.total_fee+'</total_fee> ' +
'<trade_type>'+obj.trade_type+'</trade_type> ' +
'<sign>'+obj.sign+'</sign> ' + // 此处必带签名, 否者微信在验证数据的时候是不通过的
'</xml>';
api : api.mch.weixin.qq.com/pay/unifiedorder{
"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
}
最后的参数是这样子的:{
"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
"paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
}
res.err_msg == "get_brand_wcpay_request:ok" ,这样就是成功了, 但是不是就完事儿了呢 ? 也不是,为什么呢? 微信真的收到钱了么? 收到的钱是不是你传递给微信的值呢 ?你还需要将支付的结果写数据库什么的,这些都是未知。还记的在统一下单接口中有个必须参数就是 notify_url : NOTIFY_URL,// 微信付款后的回调地址 这个地址是用户传递给微信的, 微信在收到用户的付款后会以 post 的方式请求这个接口,微信会传递用户付款的信息过来, 不过是 xml 格式的。
类系这样的 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>
注意:这里你在获取到数据后微信需要得到你的回应, 如果你一直不回应微信, 微信会请求你好几次, 这样估计你的逻辑会有问题吧,所以你需要给微信返回 xml 的格式的 回应。<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
// 解决微信支付通知回调数据
app.use(bodyParser.xml({
limit: '2MB', // Reject payload bigger than 1 MB
xmlParseOptions: {
normalize: true, // Trim whitespace inside text nodes
normalizeTags: true, // Transform tags to lowercase
explicitArray: false // Only put nodes in array if >1
}
}));
pay.getAccessToken({
notify_url : 'http://demo.com/', //微信支付完成后的回调
out_trade_no : new Date().getTime(), //订单号
attach : '名称',
body : '购买信息',
total_fee : '1', // 此处的额度为分
spbill_create_ip : req.connection.remoteAddress,
}, function (error, responseData) {
res.render('payment', {
title : '微信支付',
wxPayParams : JSON.stringify(responseData),
//userInfo : userInfo
});
});
以上がNodejsがWeChat決済機能を開発の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。