この記事は主にWeChat決済の開発プロセスに関する関連情報(bào)を紹介していますので、必要な友人は參考にしてください
私がWeChatオープンプラットフォームで決済を使用していることに注意してください。これはモバイルアプリに関連しており、それとは何の関係もありません。公開アカウント。
WeChat決済の主な操作プロセス
1. ユーザーはアプリを閲覧し、商品を選択し、注文します。
2. サーバーは注文ロジックを処理し、正式な支払いプロセスを開始します。
3. まず、バックエンド サーバーがトークンを取得するためのリクエストを weixin サーバーに開始します。
4. バックグラウンドサーバーはトークンを取得し、他のパラメーターで暗號(hào)化し、前払い ID を取得するリクエストを再度送信します
6。アプリは攜帯電話の WeChat
controlを呼び出して支払いプロセスを完了します。 7.app はバックエンド サーバーへのコールバック リクエストを開始し、トランザクションが完了したことをサーバーに通知します。
8. weixin サーバーはすべてのプロセスを処理した後、バックエンド サーバーに対して
post リクエストを開始し、トランザクションが完了したことをバックエンド サーバーに正式に通知します
上記のプロセスで注意すべき點(diǎn)がいくつかあります:1. 毎回取得されるトークンは時(shí)間に依存しており、デフォルトは 7200 秒で、1 日に最大 200 回取得できるため、
redisに入れてキャッシュ するのが最善です。有効期限が切れたら再度取得します2. アプリによって開始されたコールバックは、デフォルトでは信頼できません。バックエンドは、このトランザクションの結(jié)果を確認(rèn)するために WeChat サーバーへの注文クエリ
を開始するために最善を盡くす必要があります。 。3. Weixin サーバーによってバックグラウンドで開始される notif
y は、トランザクションの完了を確実にするための最後の障壁です。バックグラウンド サーバーは確認(rèn)後に「成功」??を返す必要があります。そうでない場(chǎng)合、weixin サーバーはリクエストの再送信を試みます。このステップは非常に簡(jiǎn)単で、取得リクエストを送信するだけです。正しいパラメータを設(shè)定するだけです。
‘‘‘從微信服務(wù)器獲取token‘‘‘ def _getAccessTokenFromWeixin(self): response = requests.get(self.tokenUrl % (self.appId, self.appSecret)) if response.status_code == 200: text = response.text tokenInfo = json.loads(text) try: token = tokenInfo[‘a(chǎn)ccess_token‘] expires_in = tokenInfo[‘expires_in‘] self._writeWeixinTokenLog(token, self.order_no) return token except KeyError: return None #token獲取失敗 return None #http請(qǐng)求失敗
prepayidを取得する
WeChat Payの開発プロセスで最も面倒なことは、prepayidを取得することです。
このステップでは、次のようなパラメーターを組み立てる必要があります:{ "appid":"wxd930ea5d5a258f4f", "traceid":"test_1399514976", "noncestr":"e7d161ac8d8a76529d39d9f5b4249ccb ", "timestamp":1399514976, "package":"bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF% 95&fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2Fweixin.qq.com&out_trade_ no=7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1& total_fee=1&sign=7F77B507B755B3262884291517E380F8", "sign_method":"sha1", "app_signature":"7f77b507b755b3262884291517e380f8" }
パッケージの組み立て
ここでの最初のステップは、パッケージを組み立てることです:
"package":"bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF% 95&fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2Fweixin.qq.com&out_trade_ no=7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1& total_fee=1&sign=7F77B507B755B3262884291517E380F8",パッケージは上記のコードに示されているとおりであるため、パラメータを準(zhǔn)備してから署名を準(zhǔn)備する必要があります。署名プロセスは次のとおりです: 1. キーの辭書順に従ってパラメータを並べ替え、それらを結(jié)合します。これらのキーには署名2が含まれていないことに注意してください。上記の文字列の後に key=paternerKey が続き、文字列全體が
md5 で署名され、この時(shí)點(diǎn)で大文字に変換されます。署名を取得します
次に、すべてのパラメータの値を URLencode し、後でそれらを結(jié)合します。sign=signValue で、パッケージ文字列を取得します。def createMD5Signature(self, signParams): ‘‘‘先排序‘‘‘ sortedParams = sorted(signParams.iteritems(), key=lambda d:d[0]) ‘‘‘拼接‘‘‘ stringSignTemp = "&".join(["%s=%s" % (item[0], item[1]) for item in sortedParams if item[0] != ‘sign‘ and ‘‘ != item[1]]) #加上財(cái)付通商戶權(quán)限密鑰 stringSignTemp += ‘&key=%s‘ % (self.partnerKey) #使用MD5進(jìn)行簽名,然后轉(zhuǎn)化為大寫 stringSign = hashlib.md5(stringSignTemp).hexdigest().upper() #Upper return stringSignパッケージをアセンブルするコード:
def getPackage(self, packageParams): ‘‘‘先獲取params的sign,然后將params進(jìn)行urlencode,最后拼接,加上sign‘‘‘ sign = self.createMD5Signature(packageParams) packageParams = sorted(packageParams.iteritems(), key=lambda d:d[0]) stringParams = "&".join(["%s=%s" % (item[0], urllib.quote(str(item[1]))) for item in packageParams]) stringParams += ‘&sign=%s‘ % (sign) return stringParams
パラメータのアセンブルを続けます
パッケージを取得した後、パラメーターを組み立てます:ここで必要なパラメーター:
appid=wxd930ea5d5a258f4f appkey=L8LrMqqeGRxST5reouB0K66CaY A WpqhA Vsq7ggKkxHCOastWksvuX1uvmvQcl xaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K noncestr=e7d161ac8d8a76529d39d9f5b4249ccb package=bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95 &fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2Fweixin.qq.com&out_trade_no =7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&tot al_fee=1&sign=7F77B507B755B3262884291517E380F8 timestamp=1399514976traceid=test_1399514976
ここには落とし穴があることに注意してください:
上記のパラメーターは署名
に含まれますが、最後のパラメーターは含まれませんappKey を含めてください。署名後は必ず
してください。
1. すべてのパラメータを辭書編集順に並べ替えて連結(jié)します 2. sha1 署名を?qū)g行し、それを上記の文字列の末尾に結(jié)合します
3. ここで appKey を削除してから、記號(hào)を追加する必要があることに注意してくださいsha1 署名コードを取得するには次のようにします:
def createSHA1Signature(self, params): ‘‘‘先排序,然后拼接‘‘‘ sortedParams = sorted(params.iteritems(), key=lambda d:d[0]) stringSignTemp = "&".join(["%s=%s" % (item[0], item[1]) for item in sortedParams]) stringSign = hashlib.sha1(stringSignTemp).hexdigest() return stringSign次に、そのようなパラメーターを取得します:
{ "appid":"wxd930ea5d5a258f4f", "noncestr":"e7d161ac8d8a76529d39d9f5b4249ccb", "package":"Sign=WXpay"; "partnerid":"1900000109" "prepayid":"1101000000140429eb40476f8896f4c9", "sign":"7ffecb600d7157c5aa49810d2d8f28bc2811827b", "timestamp":"1399514976" }prepayid を取得します コードは次のとおりです:
‘‘‘獲取預(yù)支付prepayid‘‘‘ def gerPrepayId(self, token, requestParams): ‘‘‘將參數(shù),包括package,進(jìn)行json化,然后發(fā)起post請(qǐng)求‘‘‘ data = json.dumps(requestParams) response = requests.post(self.gateUrl % (token), data=data) if response.status_code == 200: text = response.text text = json.loads(text) errcode = text[‘errcode‘] if errcode == 0: return text[‘prepayid‘] return None
プリペイドID取得する形式は次のようになります: { "prepayid":"1101000000140429eb40476f8896f4c9","errcode":0,"errmsg":"Success"}
再度署名します
ここでは、上記の sha1 署名メソッドを使用して、再度署名し、次のパラメータを取得します:{ "appid":"wxd930ea5d5a258f4f", "noncestr":"e7d161ac8d8a76529d39d9f5b4249ccb", "package":"Sign=WXpay"; "partnerid":"1900000109" "prepayid":"1101000000140429eb40476f8896f4c9", "sign":"7ffecb600d7157c5aa49810d2d8f28bc2811827b", "timestamp":"1399514976" }バックグラウンドサーバーは結(jié)果をアプリに返し、アプリは支払いを開始できます。 上記のプロセス コードは次のとおりです:
‘‘‘接收app的請(qǐng)求,返回prepayid‘‘‘ class WeixinRequirePrePaidHandler(BasicTemplateHandler): ‘‘‘這個(gè)方法在OrdersAddHandler中被調(diào)用‘‘‘ @staticmethod def getPrePaidResult(order_no, total_pay, product_name, client_ip): ‘‘‘封裝了常用的簽名算法‘‘‘ weixinRequestHandler = WeixinRequestHandler(order_no) ‘‘‘收集訂單相關(guān)信息‘‘‘ addtion = str(random.randint(10, 100)) #產(chǎn)生一個(gè)兩位的數(shù)字,拼接在訂單號(hào)的后面 out_trade_no = str(order_no) + addtion order_price = float(total_pay) #這里必須允許浮點(diǎn)數(shù),后面轉(zhuǎn)化成分之后轉(zhuǎn)化為int #order_price = 0.01 #測(cè)試 remote_addr = client_ip #客戶端的IP地址 print remote_addr current_time = int(time.time()) order_create_time = str(current_time) order_deadline = str(current_time + 20*60) ‘‘‘這里的一些參數(shù)供下面使用‘‘‘ noncestr = hashlib.md5(str(random.random())).hexdigest() timestamp = str(int(time.time())) pack = ‘Sign=WXPay‘ ‘‘‘獲取token‘‘‘ access_token = weixinRequestHandler.getAccessToken() logging.info("get token: %s" % access_token) if access_token: ‘‘‘設(shè)置package參數(shù)‘‘‘ packageParams = {} packageParams[‘bank_type‘] = ‘WX‘ #支付類型 packageParams[‘body‘] = product_name #商品名稱 packageParams[‘fee_type‘] = ‘1‘ #人民幣 fen packageParams[‘input_charset‘] = ‘GBK‘ #GBK packageParams[‘notify_url‘] = config[‘notify_url‘] #post異步消息通知 packageParams[‘out_trade_no‘] = str(out_trade_no) #訂單號(hào) packageParams[‘partner‘] = config[‘partnerId‘] #商戶號(hào) packageParams[‘total_fee‘] = str(int(order_price*100)) #訂單金額,單位是分 packageParams[‘spbill_create_ip‘] = remote_addr #IP packageParams[‘time_start‘] = order_create_time #訂單生成時(shí)間 packageParams[‘time_expire‘] = order_deadline #訂單失效時(shí)間 ‘‘‘獲取package‘‘‘ package = weixinRequestHandler.getPackage(packageParams) ‘‘‘設(shè)置支付參數(shù)‘‘‘ signParams = {} signParams[‘a(chǎn)ppid‘] = config[‘a(chǎn)ppId‘] signParams[‘a(chǎn)ppkey‘] = config[‘paySignKey‘] #delete signParams[‘noncestr‘] = noncestr signParams[‘package‘] = package signParams[‘timestamp‘] = timestamp signParams[‘traceid‘] = ‘mytraceid_001‘ ‘‘‘生成支付簽名‘‘‘ app_signature = weixinRequestHandler.createSHA1Signature(signParams) ‘‘‘增加不參與簽名的額外參數(shù)‘‘‘ signParams[‘sign_method‘] = ‘sha1‘ signParams[‘a(chǎn)pp_signature‘] = app_signature ‘‘‘剔除appKey‘‘‘ del signParams[‘a(chǎn)ppkey‘] ‘‘‘獲取prepayid‘‘‘ prepayid = weixinRequestHandler.gerPrepayId(access_token, signParams) if prepayid: ‘‘‘使用拿到的prepayid再次準(zhǔn)備簽名‘‘‘ pack = ‘sign=WXPay‘ prepayParams = {} prepayParams[‘a(chǎn)ppid‘] = config[‘a(chǎn)ppId‘] prepayParams[‘a(chǎn)ppkey‘] = config[‘paySignKey‘] prepayParams[‘noncestr‘] = noncestr prepayParams[‘package‘] = pack prepayParams[‘partnerid‘] = config[‘partnerId‘] prepayParams[‘prepayid‘] = prepayid prepayParams[‘timestamp‘] = timestamp ‘‘‘生成簽名‘‘‘ sign = weixinRequestHandler.createSHA1Signature(prepayParams) ‘‘‘準(zhǔn)備輸出參數(shù)‘‘‘ returnParams = {} returnParams[‘status‘] = 0 returnParams[‘retmsg‘] = ‘success‘ returnParams[‘a(chǎn)ppid‘] = config[‘a(chǎn)ppId‘] returnParams[‘noncestr‘] = noncestr returnParams[‘package‘] = pack returnParams[‘prepayid‘] = prepayid returnParams[‘timestamp‘] = timestamp returnParams[‘sign‘] = sign returnParams[‘partnerId‘] = config[‘partnerId‘] returnParams[‘a(chǎn)ddtion‘] = addtion else: ‘‘‘prepayid獲取失敗‘‘‘ returnParams = {} returnParams[‘status‘] = -1 returnParams[‘retmsg‘] = ‘prepayid獲取失敗‘ else: ‘‘‘token獲取失敗‘‘‘ returnParams = {} returnParams[‘status‘] = -1 returnParams[‘retmsg‘] = ‘token獲取失敗‘ ‘‘‘生成json格式文本,然后返回給APP‘‘‘ return returnParams
バックグラウンドの非同期通知
WeChat サーバーによって送信される通知非同期通知は、安全 の理由から、必ず行わなければなりません。 do it 拡張子:
拡張コードは次のとおりです:def isTenpaySign(self, params): helper = WeixinRequestHandler() sign = helper.createMD5Signature(params) return params[‘sign‘] == sign全體的なプロセスは次のとおりです:
‘‘‘微信服務(wù)器向后臺(tái)發(fā)送的異步通知‘‘‘ class WeixinAppNotifyHandler(BasicTemplateHandler): def initialize(self): self.weixinResponseHandler = WeixinResponseHandler() def post(self): ‘‘‘解析參數(shù)‘‘‘ params = self.parseQueryString() ‘‘‘驗(yàn)證是否是weixin服務(wù)器發(fā)回的消息‘‘‘ verifyWeixinSign = self.weixinResponseHandler.isTenpaySign(params) ‘‘‘處理訂單‘‘‘ if verifyWeixinSign: ‘‘‘訂單邏輯‘‘‘ order_no = str(params[‘out_trade_no‘]) order_no = order_no[0:-2] print ‘%s paied successfully‘ % order_no self.saveWeixinReceipt(params) updateOrdersPaidByWeixin(order_no) #更新訂單使用狀態(tài) consumeCouponByOrderNo(order_no) #優(yōu)惠券已經(jīng)使用 self.write("success") else: self.write("fail") def parseQueryString(self): ‘‘‘獲取url中所有的參數(shù)‘‘‘ uri = self.request.uri ‘‘‘解析出URI中的query字符串‘‘‘ parseResult = urlparse.urlparse(uri) query = parseResult.query ‘‘‘解析query字符串‘‘‘ params = urlparse.parse_qs(query) for item in params: params[item] = params[item][0].strip() return params
最後に、ユーザーが攜帯電話で支払いを完了した時(shí)點(diǎn)では、支払いは成功したとみなされません。Weixin サーバーが通知通知によって返された成功を受信した場(chǎng)合にのみ、この時(shí)點(diǎn)で攜帯電話は最終的にトランザクションを受け取ることができます。公式の WeChat 通知。
上記は WeChat 決済の開発プロセスに関する情報(bào)をまとめたものです。今後も関連情報(bào)を追加していきます。このサイトをよろしくお願(yuàn)いします。
以上がWeChat Payの開発プロセスの詳細(xì)な紹介の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國(guó)語(yǔ)版
中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PHP は、Web 開発およびサーバーサイド プログラミング、特に WeChat 開発で広く使用されているオープン ソースのスクリプト言語(yǔ)です?,F(xiàn)在、ますます多くの企業(yè)や開発者が WeChat 開発に PHP を使用し始めています。これは、PHP が本當(dāng)に學(xué)びやすく、使いやすい開発言語(yǔ)となっているためです。 WeChat の開発では、メッセージの暗號(hào)化と復(fù)號(hào)化はデータのセキュリティに関わるため、非常に重要な問題となります。暗號(hào)化と復(fù)號(hào)化の方法を持たないメッセージの場(chǎng)合、ハッカーは簡(jiǎn)単にデータを入手でき、ユーザーに脅威を與える可能性があります。

WeChat パブリック アカウントの開発では、投票機(jī)能がよく使用されます。投票機(jī)能はユーザーが気軽に交流に參加できるほか、イベントの開催や意見調(diào)査などにも重要なツールです。この記事では、PHPを使用してWeChatの投票機(jī)能を?qū)g裝する方法を紹介します。 WeChat公式アカウントの認(rèn)証を取得する まずはWeChat公式アカウントの認(rèn)証を取得する必要があります。 WeChatパブリックプラットフォームでは、WeChatパブリックアカウント、公式アカウント、およびパブリックアカウントに対応するトークンのAPIアドレスを設(shè)定する必要があります。 PHP言語(yǔ)を使用した開発の過程では、WeChatが公式に提供するPHを使用する必要があります

WeChat の人気に伴い、マーケティング ツールとして WeChat を使用し始める企業(yè)が増えています。 WeChat グループ メッセージング機(jī)能は、企業(yè)が WeChat マーケティングを行うための重要な手段の 1 つです。ただし、手動(dòng)送信のみに頼ると、マーケターにとって非常に時(shí)間と労力がかかる作業(yè)になります。したがって、WeChat マス メッセージング ツールを開発することが特に重要です。この記事では、PHP を使用して WeChat マス メッセージング ツールを開発する方法を紹介します。 1. 準(zhǔn)備作業(yè) WeChat マス メッセージング ツールを開発するには、次の技術(shù)點(diǎn)を習(xí)得する必要があります。 PHP WeChat パブリック プラットフォーム開発の基礎(chǔ)知識(shí) 開発ツール: Sub

WeChat は現(xiàn)在、世界最大のユーザーベースを持つソーシャル プラットフォームの 1 つであり、モバイル インターネットの普及に伴い、ますます多くの企業(yè)が WeChat マーケティングの重要性を認(rèn)識(shí)し始めています。 WeChat マーケティングを?qū)g施する場(chǎng)合、顧客サービスは重要な部分です。カスタマー サービスのチャット ウィンドウをより適切に管理するために、WeChat 開発に PHP 言語(yǔ)を使用できます。 1. PHP WeChat 開発の概要 PHP は、Web 開発の分野で広く使用されているオープン ソースのサーバー側(cè)スクリプト言語(yǔ)です。 WeChat パブリック プラットフォームが提供する開発インターフェイスと組み合わせると、PHP 言語(yǔ)を使用して WeChat を?qū)g行できます。

WeChat パブリック アカウントの開発において、ユーザー タグ管理は非常に重要な機(jī)能であり、開発者がユーザーをよりよく理解し、管理できるようになります。この記事では、PHPを使用してWeChatのユーザータグ管理機(jī)能を?qū)g裝する方法を紹介します。 1. WeChat ユーザーの openid を取得する WeChat ユーザータグ管理機(jī)能を使用する前に、まずユーザーの openid を取得する必要があります。 WeChat パブリック アカウントの開発では、ユーザーの承認(rèn)を通じて openid を取得するのが一般的です。ユーザー認(rèn)証が完了したら、次のコードを通じてユーザーを取得できます。

WeChat が人々の生活においてますます重要なコミュニケーション ツールになるにつれ、その機(jī)敏なメッセージング機(jī)能はすぐに多くの企業(yè)や個(gè)人に支持されるようになりました。企業(yè)にとって、WeChat をマーケティング プラットフォームとして開発することがトレンドになっており、WeChat 開発の重要性が徐々に顕著になってきています。その中でも、グループ送信機(jī)能はさらに広く使用されているため、PHP プログラマとしてグループ メッセージ送信レコードを?qū)g裝するにはどうすればよいでしょうか?以下に簡(jiǎn)単に紹介します。 1. WeChat パブリック アカウントに関する開発知識(shí)を理解する グループ メッセージ送信レコードの実裝方法を理解する前に、

PHP を使用して WeChat 公開アカウントを開発する方法 WeChat 公開アカウントは、多くの企業(yè)にとってプロモーションと交流のための重要なチャネルとなっており、一般的に使用される Web 言語(yǔ)として PHP を使用して WeChat 公開アカウントを開発することもできます。この記事では、PHP を使用して WeChat 公開アカウントを開発する具體的な手順を紹介します。ステップ1:WeChat公式アカウントの開発者アカウントを取得する WeChat公式アカウントの開発を開始する前に、WeChat公式アカウントの開発者アカウントを申請(qǐng)する必要があります。具體的な登録プロセスについては、WeChat パブリック プラットフォームの公式 Web サイトを參照してください。

インターネットとモバイル スマート デバイスの発展に伴い、WeChat はソーシャルおよびマーケティング分野に欠かせないものになりました。デジタル化が進(jìn)むこの時(shí)代において、WeChat 開発に PHP を使用する方法が多くの開発者の焦點(diǎn)になっています。この記事では主に、PHP を WeChat 開発に使用する方法とそのヒントや注意事項(xiàng)を紹介します。 1. 開発環(huán)境の準(zhǔn)備 WeChat を開発する前に、まず対応する開発環(huán)境を準(zhǔn)備する必要があります。具體的には、PHP オペレーティング環(huán)境と WeChat パブリック プラットフォームをインストールする必要があります。
