会社のビジネスシナリオでは、WeChat アカウント分割機能を使用する必要があります。公式 Web サイトのドキュメントに従って午後 1 回デバッグした後、ようやく機能するようになり、Nodejs WeChat アカウント分割を使用するプロセスを記録しました。 前提条件
具体的な実装// @router post -> share -> /common/payment/share 非同期共有(){ const { ctx } = これ 定数 nonce_str = ctx.service.wx.randomStr() //販売者ID 定数 mch_id = '123456' // x アプレットのアプリ ID 定数アプリID = 'wx123456' // 注文番号 const out_order_no = '1609745196755nFvdMaYub2' // WeChat 支払い注文番号 const transaction_id = '4200000801202101044301662433' //販売者秘密 定数キー = '9813490da1ffb80afaa36f6f1265e490' // このブロックのパラメータは公式ドキュメントで詳しく説明されています const params = { アプリド、 、 nonce_str、 アウトオーダー番号、 受信者: `[{"account": "123qwe","amount": 1,"description": "description","type": "PERSONAL_OPENID"}]`, 署名タイプ: 'HMAC-SHA256'、 トランザクションID、 } // 署名方法はHMAC-SHA256である必要があります const 符号 = ctx.service.wx.sign(params, キー, 'HMAC-SHA256') // xml文字列 const フォームデータ = `<xml> <appid>${appid}</appid> <mch_id>${mch_id}</mch_id> <nonce_str>${nonce_str}</nonce_str> <out_order_no>${out_order_no}</out_order_no> <トランザクション ID>${トランザクション ID}</トランザクション ID> <sign>${sign}</sign> <sign_type>HMAC-SHA256</sign_type> <レシーバー>${params.receivers}</レシーバー> </xml>` const res = ctx.curl( を待つ 「https://api.mch.weixin.qq.com/secapi/pay/profitsharing」、 { // 証明書 apiclient_cert を使用する必要があります 証明書: fs.readFileSync(path.join(__dirname,'../../../cert/apiclient_cert.pem')), // 証明書 apiclient_key を使用する必要があります キー: fs.readFileSync(path.join(__dirname,'../../../cert/apiclient_key.pem')), メソッド: "post", データ: フォームデータ、 } ) 定数データ文字列 = res.data.toString() xml2js.parseString(データ文字列、(エラー、結果) => { もし(エラー){ ctx.throw(422, エラー) } console.log(結果) }) } //ランダム文字列 // ランダムな文字列を生成する randomStr(len = 24) { 定数str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 結果を '' とします。 (i = 0; i < len; i++) の場合 { 結果 += str[Math.floor(Math.random() * str.length)]; } 結果を返します。 } // 署名 // mchKey は販売者の秘密です。そうでなければ署名は通過しません sign(data, mchKey, signType = 'MD5') { 定数キー = []; for (const キー in データ) { if (データ[キー] !== 未定義) { keys.push(キー); } } // 辞書ソート => キー=値 const stringA = キー 。選別() .map(キー => `${key}=${decodeURIComponent(data[key])}`) 。参加する('&'); // 販売者キーを連結する const stringSignTemp = stringA + '&key=' + mchKey; // 暗号化 let hash; (符号タイプ === 'MD5')の場合{ ハッシュ = crypto.createHash('md5').update(stringSignTemp); } それ以外 { ハッシュ = crypto.createHmac('sha256', mchKey).update(stringSignTemp, 'utf8'); } 定数 paySign = hash.digest('hex').toUpperCase(); paySign を返します。 } 署名失敗の問題が発生した場合。生成した formData をインターフェース署名検証ツールに入力して、段階的に検証することができます。 アカウント分割インターフェースに関するその他の一般的な問題 Nodejs で WeChat アカウント分割を実装するためのサンプルコードに関するこの記事はこれで終わりです。Nodejs で WeChat アカウント分割に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL 5.7.17 winx64 無料インストールバージョン設定方法グラフィックチュートリアル
>>: Linux でプロセスを隠す方法と、遭遇する落とし穴
この記事では、例を使用して、MySQL 8 の共通テーブル式 (CTE) の使用方法を説明します。ご...
目次1. 実装2. 問題点3. より良い実装方法があるかどうか検討する要約する背景は日付のタイトルで...
目次1. uniappプラグインマーケットのリファレンスプラグイン2. 具体的な導入プロセス1. m...
背景次の図に示すように、 react-color を使用してフロントエンド インターフェースのカラー...
MySQL 自体はファイルシステムに基づいて開発されましたが、ロックの存在が異なります。データベース...
目次ジェネリック型での条件型の使用ツールタイプ脱出ポッド矢印関数で条件型を使用する型推論による条件型...
この記事では、ショッピングカートの増減と価格計算を実現するためのjsの具体的なコードを紹介します。具...
MySQL データベースを使用すると、他のユーザーが定義したストアド プロシージャを他のユーザーが変...
デフォルトでは、コンテナ データの読み取りと書き込みはコンテナのストレージ レイヤーで行われます。コ...
序文3 列レイアウトは、その名前が示すように、両側が固定され、中央が適応します。実際の開発では、3 ...
目次クエリキャッシュの最適化概要クエリプロセスクエリキャッシュ構成クエリキャッシュの無効化メモリ管理...
目次序文解析パラメータURLパラメータを変更する要約する序文URLオブジェクトはページ側ではあまり使...
このセクションでは、Web ページ内のテキストをスクロールしたり、スクロール プロパティを制御できる...
今日、ある人がウェブサイト開発プロジェクトについて話をしてくれました。具体的な要件について話すと、「...
VMware Workstation を使用して Windows 10 で仮想マシンを開くと、VMw...