公式アカウントでの WeChat 支払いは JS を通じて実装する必要があります。 WeChat JS-SDK は、Web 開発者向けの WeChat パブリック プラットフォームによって提供される WeChat に基づく Web 開発ツールキットです。
1) JS スクリプト ファイルを導入します
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
2) 設定インターフェイスを通じて権限検証設定を挿入します
<script> wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 }); </script>
appId はアプリケーションID、wx 文字列から始まり、timestampはphpのtime()を使用して取得され、nonceStrはuniqid()を使用して取得され、signatureは特定のアルゴリズムに従って取得されます。
protected function getJsapiConfig() { $weixin = new Weixin(); $ticketMongo = new WeixinJsapiTicket(); $data = [ 'appId' => $weixin->getAppId(), 'noncestr' => uniqid(), 'jsapi_ticket' => $ticketMongo->getJsapiTicket(), 'timestamp' => time() ]; //拼装原始待签名串 $src = [ 'noncestr=' . $data['noncestr'], 'jsapi_ticket=' . $data['jsapi_ticket'], 'timestamp=' . $data['timestamp'] ]; sort($src); $data['signature'] = sha1(implode('&', $src)); return $data; }
「jsapi_ticket」について説明します。 jsapi_ticket は、公式アカウントが WeChat JS インターフェースを呼び出すために使用する一時的なチケットです。通常の状況では、access_token を通じて取得される jsapi_ticket の有効期間は 7200 秒です。時間制限があり、jsapi_ticket を取得するための API 呼び出しの回数は非常に限られているため、取得した jsapi_ticket を MongoDB に保存します。
/** * 通过access_token获取jsapi_ticket * @param $access_token * @return string | null */ public function getJsapiTicket($access_token) { $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket'; $param = [ 'access_token' => $access_token, 'type' => 'jsapi' ]; $res = $this->request($url, $param); $result = json_decode($res, true); if (isset($result['errcode']) && $result['errcode'] == 0 && isset($result['ticket'])) { return $result; } return null; }
3) 準備完了インターフェースを介して成功した検証を処理します
1) prepay_id は、ローカルに生成された注文番号などに基づいて取得されます。注文番号は要求されるたびに異なり、それ以外の場合はエラーになります報告されます
2) md5(uniqid('baiaimama'))を使用してnonceStrを取得します
3) MD5をsignTypeに使用します
4) paySignは、コードのパラメータに従ってソートおよび連結することによって取得されます。
wx.chooseWXPay({ timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: '', // 支付签名随机串,不长于 32 位 package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '', // 支付签名 success: function (res) { // 支付成功后的回调函数 } });
/** * 生成jsapi需要调用的参数 */ public function getJsapiParam(){ $param = [ 'appId' => $this->APPID, 'timeStamp' => time(), 'nonceStr' => md5(uniqid('baiaimama')), 'package' => 'prepay_id='.$this->param['prepay_id'], 'signType' => 'MD5' ]; $str = []; foreach($param as $k=>$v){ if(!empty($v)){ $str[] = "{$k}={$v}"; } } sort($str); $unsignKey = join('&', $str).'&key='.$this->KEY; $sign = strtoupper(md5($unsignKey)); $param['paySign'] = $sign; return $param; }
非同期コールバックでは、注文ステータスの変更、テキスト メッセージの送信、メッセージのプッシュなどの操作を実行します。
/** * 微信支付异步回调API * 微信支付成功,会收到异步回调 */ public function actionWxpay() { $weixinPay = new WeixinPay(); $weixin = new Weixin(); $xml = file_get_contents('php://input'); $msg = $weixin->parseMsg($xml); //记录微信推送日志 $notifyMongo = new WeixinPayNotify(); $notifyMongo->logPayNotify($xml); if(!$msg || !is_object($msg)){ $weixinPay->notifyXml('FAIL', '通知不合法'); } if(!isset($msg->return_code) || $msg->return_code != 'SUCCESS'){ $weixinPay->notifyXml('FAIL', '通信失败'); } if(!isset($msg->result_code) || $msg->result_code != "SUCCESS"){ $weixinPay->notifyXml('FAIL', '交易失败'); } //签名验证失败 if(!$weixinPay->checkSign($msg)){ $weixinPay->notifyXml('FAIL', '签名验证失败'); } //$notifyMongo->add($msg); //流程走到这里说明已经支付成功了,这里无需更新订单逻辑 $userOrder = new UserOrder(); //记录微信订单号 $userOrder->pay($msg->out_trade_no, $msg->transaction_id); }
デモのダウンロード:
githubアドレス: https://github.com/pwstrick/weixin_demo
CSDNアドレス: http://download.csdn .net/detail/loneleaf1/9045731
WeChat パブリック プラットフォーム開発および WeChat 決済関連記事の詳細については、PHP 中国語 Web サイトに注目してください。