ホームページ  >  記事  >  WeChat アプレット  >  Nodejs WeChat パブリック アカウント支払いの開発

Nodejs WeChat パブリック アカウント支払いの開発

高洛峰
高洛峰オリジナル
2017-01-04 16:52:001968ブラウズ

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 を確認してください。 WeChat公式Webサイトの手順
4.scope=snsapi_userinfoを次のように記述します。詳細な手順については、WeChat公式Webサイトの手順を確認してください
5.詳細な手順については、次のように記述します。 6. wechat_redirect: このように記述します。詳細な手順については、WeChat 公式 Web サイトの手順を確認してください
ps: 公式 Web サイトのリンク:

2. access_token、コードを介して openid

最初のステップはコードの値を取得することであり、次に access_token の値を取得する必要があります。 コードを介して openid、要求された API

API https://api.weixin.qq.com/sns/oauth2 /access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
API のパラメータ説明:

1. appid WeChat パブリック アカウント ID、WeChat 公式アカウントのバックグラウンドで WeChat 公式アカウントの秘密キーを取得します。 WeChat 公式アカウントの秘密鍵をバックグラウンドで取得します。 最初のステップは、使用するコードを取得することです。 3. access_token を呼び出します。 access_token は後続の機能を実行できます。公式の例を参照してください:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316518&lang=zh_CN
4. 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();
}

上記のコードを参照してください。WeChatの支払い機能を呼び出したい場合は、パラメータを渡す必要があります。

{
 "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 
 "timeStamp":" 1395712654",  //时间戳,自1970年以来的秒数 
 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 
 "package" : "prepay_id=u802345jgfjsdfgsdg888", 
 "signType" : "MD5",  //微信签名方式: 
 "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
}

パラメータの説明: appId //公式アカウント名。 、マーチャントによって渡されます

2. timeStamp //タイムスタンプ、1970 年からの秒数。ここでは特に注意が必要です。文字列のタイムスタンプ形式である必要があります。つまり、引用符である必要があります。

3. nonceStr // ランダムな文字列 32 ビット、続いて Provide メソッド

4. SignType // WeChat 署名メソッド: MD5
5. paySign // WeChat 署名、**パッケージ** // これは最も重要なことは、どこで入手したのかということです。 次。
ps: 公式 Web サイトのインターフェイスの説明
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

5. パッケージを取得し、統合注文から prepay_id を取得します。 WeChatのインターフェース

公式API:

https://api.mch.weixin.qq.com/pay/unifiedorder


リクエストパラメータはたくさんありますが、一部は必須ではありません

{
 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',
}

WeChat での統一された順序付け インターフェイスでは XML データを渡す必要があり、データには署名も必要なので、最初にデータに署名します。
署名ルールについては、WeChatが提供する署名ルールを参照してください(署名方法は後述します)
WeChat公式署名ルール:
https://pay.weixin.qq.com/wiki/doc/api/jsapi .php?chapter= 4_3

署名を生成した後、データを XML 形式に組み立てる必要があります:

var body = &#39;<xml> &#39; +
 &#39;<appid>&#39;+config.wxappid+&#39;</appid> &#39; +
 &#39;<attach>&#39;+obj.attach+&#39;</attach> &#39; +
 &#39;<body>&#39;+obj.body+&#39;</body> &#39; +
 &#39;<mch_id>&#39;+config.mch_id+&#39;</mch_id> &#39; +
 &#39;<nonce_str>&#39;+obj.nonce_str+&#39;</nonce_str> &#39; +
 &#39;<notify_url>&#39;+obj.notify_url+&#39;</notify_url>&#39; +
 &#39;<openid>&#39;+obj.openid+&#39;</openid> &#39; +
 &#39;<out_trade_no>&#39;+obj.out_trade_no+&#39;</out_trade_no>&#39;+
 &#39;<spbill_create_ip>&#39;+obj.spbill_create_ip+&#39;</spbill_create_ip> &#39; +
 &#39;<total_fee>&#39;+obj.total_fee+&#39;</total_fee> &#39; +
 &#39;<trade_type>&#39;+obj.trade_type+&#39;</trade_type> &#39; +
 &#39;<sign>&#39;+obj.sign+&#39;</sign> &#39; + // 此处必带签名, 否者微信在验证数据的时候是不通过的
 &#39;</xml>&#39;;

次のステップは、API に prepay_id の値を取得するようリクエストすることです。上で取得した XML データを API に送信します。以下のように WeChat に送信します。Wechat はデータが正しいことを確認します。必要な値を戻します。

api: https://api.mch.weixin.qq.com/pay/unifiedorder

6. prepay_id を取得した後、h5 セクションで WeChat 支払いを直接呼び出すことができますか?答えはまだ出ていません。

prepay_idを取得した後、WeChat支払い関数を呼び出すh5のパラメータは次のとおりです:

{
 "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 
 "timeStamp":" 1395712654",  //时间戳,自1970年以来的秒数 
 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 
 "package" : "prepay_id=u802345jgfjsdfgsdg888", 
 "signType" : "MD5",  //微信签名方式:
}

有了这样的参数, 那么你还需要吧所有参与的参数做签名。签名规跟上面的一样,生成了签名后需要吧签名的参数 paySign 赋给h5 呼起微信的支付功能的参数(也就是微信的签名不参与签名的生成) 
最后的参数是这样子的:

{
 "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 
 "timeStamp":" 1395712654",  //时间戳,自1970年以来的秒数 
 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 
 "package" : "prepay_id=u802345jgfjsdfgsdg888", 
 "signType" : "MD5",  //微信签名方式:
 "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
}

如果你的各个环节都没有问题, 那么得到了这样参数后你就可以正常的调用起微信的支付功能, 跟原生的功能是没有任何的差别的,(估计你现在的心里也特高兴吧, 没有 app 竟然可以使用 app 的功能,就是这么的神奇)。

七.支付完成的回调

微信支付完了后会在 h5 页面的微信支付的回调函数里面放回值, 
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 的格式的 回应。

<xml>
 <return_code><![CDATA[SUCCESS]]></return_code>
 <return_msg><![CDATA[OK]]></return_msg>
</xml>

小坑:node ,express 框架开发, 如果你在微信的支付成功后的回调中没有获取到任何 xml 的值, 那么你需要安装一组件:body-parser-xml, 你可以使用 npm install body-parser-xml --save 安装, 在 app.js 里面require('body-parser-xml')(bodyParser);,使用中间件的方式

// 解决微信支付通知回调数据
app.use(bodyParser.xml({
 limit: &#39;2MB&#39;, // 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
 }
}));

这样你就可以正常的获取到微信的 xml 数据了。

使用方法:

pay.getAccessToken({
 notify_url : &#39;http://demo.com/&#39;, //微信支付完成后的回调
 out_trade_no : new Date().getTime(), //订单号
 attach : &#39;名称&#39;,
 body : &#39;购买信息&#39;,
 total_fee : &#39;1&#39;, // 此处的额度为分
 spbill_create_ip : req.connection.remoteAddress,
 }, function (error, responseData) {
 res.render(&#39;payment&#39;, {
  title : &#39;微信支付&#39;,
  wxPayParams : JSON.stringify(responseData),
  //userInfo : userInfo
 });
 });

就到这里吧, 感觉也差不多了。如有不对的地方还请指正。

更多nodejs微信公众号支付开发相关文章请关注PHP中文网!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。