Nodejs で WeChat アカウント分割を実装するためのサンプルコード

Nodejs で WeChat アカウント分割を実装するためのサンプルコード

会社のビジネスシナリオでは、WeChat アカウント分割機能を使用する必要があります。公式 Web サイトのドキュメントに従って午後 1 回デバッグした後、ようやく機能するようになり、Nodejs WeChat アカウント分割を使用するプロセスを記録しました。

前提条件

  • WeChat マーチャントプラットフォーム製品センター -> マイプロダクトで、支払い拡張ツールの分割アカウント機能を有効にします。
  • 請求先を追加します。 このステップが設定されていない場合、*分割アカウント受信者関係が存在しないことが報告されます。パラメータで各受信者の関係を確認してください。 *間違い
  • マーチャントプラットフォームでマーチャントIDとシークレットを取得する
  • apiclient_cert.pem と apiclient_key をサーバー上のディレクトリに転送する必要があります。

具体的な実装

// @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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nodejs エラー処理プロセス記録
  • Node.js環境でMySQLデータベースを素早く操作する方法を詳しく説明します
  • Nodejs でタイムドクローラーを実装する完全な例
  • NodeJSとブラウザにおけるこのキーワードの違い
  • Node.js の TCP 接続処理のコア プロセス
  • Nodejs 配列キューと forEach アプリケーションの詳細な説明
  • 1 つの記事で Node.js の非同期プログラミングを学ぶ
  • Node.jsで子プロセスを作成する方法
  • nodejs で worker_threads を使用して新しいスレッドを作成する方法
  • Nodejs での WeChat アプレット メッセージ プッシュの実装
  • Node.js における非同期プログラミングの知識ポイントの詳細な説明
  • nodejs+expressでデータベースに接続する最も簡単な方法
  • Windows でインストールされた Node.js の上位バージョンを下位バージョンにダウングレードする方法 (グラフィック チュートリアル)
  • NodeJS CORS設定の実装プロセスの詳細な説明
  • Node.js を使用して定期的にメールリマインダーを自動的に送信する方法 (非常に実用的)
  • Alibaba Cloud での Node.js プロジェクトの簡単なデプロイ
  • Node.js を使用してコマンドライン ゲームを実装する方法
  • Node.jsを理解するのはとても簡単です

<<:  MySQL 5.7.17 winx64 無料インストールバージョン設定方法グラフィックチュートリアル

>>:  Linux でプロセスを隠す方法と、遭遇する落とし穴

推薦する

純粋な CSS3 で美しい入力ボックスアニメーションスタイルライブラリを実現 (テキスト入力愛)

純粋な CSS3 で実装された美しい入力ボックス アニメーション スタイル ライブラリを共有します ...

MySQLが2つのテーブルを関連付ける際のエンコードの問題と解決策

Mysqlが2つのテーブルを関連付けると、次のエラーメッセージが生成されます:照合順序の不正な組み合...

Linuxで同一ファイルを見つける方法

コンピュータを使用すると、システム内に大量のゴミが生成されます。最も一般的なケースは、同じファイルが...

MySQL 8.0.21 の最新バージョンのダウンロード、インストール、設定に関する詳細なチュートリアル

1. ダウンロード1. インストールパッケージをダウンロードするMySQL ダウンロード パス: h...

Vueソースコード解析における仮想DOMの詳しい説明

なぜ仮想DOMが必要なのでしょうか?仮想 DOM はブラウザのパフォーマンス問題を解決するために設計...

Mysql binlog ログファイルが大きすぎる場合の解決策

目次1. 関連するbinlog設定2. binlogに関する詳細設定2.1 バイナリログモードの変更...

JS 非同期コードユニットテストの魔法 Promise

目次序文プロミスチェーンMDN エラー連鎖デフォルト処理略語非同期待機序文この記事を書いた理由は、ユ...

MySQL 8.0.15 のダウンロードとインストールの詳細なチュートリアルは初心者にとって必須です。

この記事では、MySQL 8.0.15をダウンロードしてインストールするための具体的な手順を参考まで...

MySQLにおけるトランザクションの永続性実装原理の詳細な説明

序文データベース トランザクションに関して言えば、トランザクションの ACID 特性、分離レベル、解...

HTML ページ共通スタイル (推奨)

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピーbody、di...

Linuxカーネルスケジューラソースコード初期化の分析

目次1. はじめに2. スケジューラの基本概念2.1. 実行キュー (rq) 2.2 スケジューリン...

Linux で unzip コマンドを使用して複数のファイルを解凍する方法

Linuxにunzipコマンドがない問題の解決策unzipコマンドを使用して.zipファイルを解凍す...

HTML の表のフレームとルール属性の詳細な説明

テーブル タグの frame 属性と rules 属性は境界線の表示を制御できます。フレーム プロパ...

MySQL で結合を使用して SQL を最適化する方法の詳細な説明

0. 以下のテストに関連する表を準備する関連するテーブル作成ステートメントについては、https:/...

MySQL データベースの基礎 SQL ウィンドウ関数の例の分析チュートリアル

目次導入導入集計関数 + over()ソート関数 + over() ntile() 関数 + ove...