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 でプロセスを隠す方法と、遭遇する落とし穴

推薦する

Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法

1. 遭遇したいくつかの問題2008 年にパフォーマンス テストを行っていたとき、パフォーマンス テ...

Vue はトークンを取得してトークン ログインのサンプル コードを実装します

ログイン認証にトークンを使用する考え方は次のとおりです。 1. 初めてログインする場合、フロントエン...

Windows で Nginx を使用して https サーバーとリバース プロキシを構成する際の問題

リクエストロジックフロントエンド --> https経由でnginxをリクエストnginx -...

IframeとFRAMEの違いの分析

1. Iframe タグの使用<br />Iframe については、「忘れられた隅」に放...

docker を使用してシンプルな C/C++ プログラムをデプロイする方法

1. まずhello-world.cppファイルを作成しますプログラムコードは次のとおりです。 #i...

JavaScript Three.js でテキストを作成する最初の経験

目次効果テキストの作成を開始するまずフォントローダーを作成するフォントライブラリを読み込むテキストジ...

Docker コンテナのネットワーク障害に対する 6 つの解決策

Docker コンテナのネットワーク障害に対する 6 つの解決策注: 以下の方法は、コンテナ内のパブ...

Docker+Selenium Grid に基づく技術アプリケーションをテストするためのサンプル コード

Selenium Grid の紹介Selenium Grid のいくつかの新しい機能は、今後リリース...

CentOS 7 に PHP5 用の suPHP をインストールする方法 (Peng Ge)

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

MySQL InnoDB ReplicaSet の簡単な紹介

目次01 InnoDBレプリカセットの紹介02 InnoDBレプリカセットの制限03 導入前に知って...

Ubuntu 18.04 のsources.listをAlibabaまたはTsinghuaミラーに変更する方法

1. バックアップソースリストUbuntu のデフォルトのソースは国内サーバーではないため、更新され...

MySQL 実験: explain を使用してインデックスの傾向を分析する

概要インデックス作成は、MySQL で習得しなければならないスキルであり、MySQL クエリの効率を...

Dockerコンテナ接続実装手順の分析

一般的に言えば、コンテナが起動した後、ポート マッピングを通じてコン​​テナが提供するサービスを使用...

DockerコンテナのライフサイクルアーキテクチャとVMとの違いについて詳しく説明します。

コンテナのライフサイクルコンテナランタイムのライフサイクルコンテナは、分離特性を持つプロセスのセット...

見落とされがちなMETAタグの特殊効果(ページ遷移効果)

Web デザインで js を使用すると、多くのページ効果を実現できますが、HTML タグの META...