この記事では、WeChat 支払い PHP SDK の WeChat パブリック アカウント支払い実裝コードに関する関連情報を主に紹介します。必要な友達は參照してください
WeChat 支払いをすでに申請していることを前提としています
1。寫真などの WeChat 背景設定
最初にテストするので、最初にテスト認証ディレクトリとテストホワイトリストを追加します。テスト認証ディレクトリは、WeChat リクエストを開始するファイルが配置されているディレクトリです。
例: jsapi リクエストを行うときに jsapi.php が配置されるディレクトリは通常テスト ディレクトリであり、テスト ホワイトリストは開発者の WeChat アカウントです。
公式の支払い承認ディレクトリは、テストされたディレクトリと同じであってはなりません。そうでない場合は、エラーが報告されます。認証ディレクトリとテスト ホワイトリストを入力しなかったり、間違って入力したりすると、エラーが発生します。
エラーレポートの例:
NaNsystem: access_denied
はテストホワイトリストにありません
2. lib/WxPay.Config.phpファイルを設定します
最も重要な構(gòu)成項目
const APPID = '';
const MCHID = '';
const KEY = '';
const APPSECRET = '';
APPID と APPSECRET はどちらも WeChat バックエンドで見つけることができます。
MCHIDはWeChat支払いの申請後に送信されるメールに記載されており、KEYはメールのプロンプトに従って販売者プラットフォームで設定できます
。
3. 開始のindex.phpにアクセスします
最初にindex.phpにアクセスすると、インターフェイスが表示されます
最初に必要なのはJSAPI支払いです。ただし、コードindex.phpの下部にあるリンクを見てください。デフォルトではデモリンクですが、カスタマイズしたリンクに変更できます
<ul> <li style="background-color:#FF7F24"><a href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/jsapi.php';?>">JSAPI支付</a></li> <li style="background-color:#698B22"><a href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/micropay.php';?>">刷卡支付</a></li> <li style="background-color:#8B6914"><a href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/native.php';?>">掃碼支付</a></li> <li style="background-color:#CDCD00"><a href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/orderquery.php';?>">訂單查詢</a></li> <li style="background-color:#CD3278"><a href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/refund.php';?>">訂單退款</a></li> <li style="background-color:#848484"><a href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/refundquery.php';?>">退款查詢</a></li> <li style="background-color:#8EE5EE"><a href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/download.php';?>">下載訂單</a></li> </ul>
もちろん、獨自のアクセスリンクとして直接記述することもできます。
4. JSAPI支払い
必要なコード分析:
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log'); $log = Log::Init($logHandler, 15);
logクラスを呼び出す $log->DEBUG(‘test‘);を通じてデバッグ情報を出力できます。実際、$Log::DEBUG('test'); を直接使用して
$tools = new JsApiPay(); $openId = $tools->GetOpenid();
をデバッグすることもできます。主に、GetOpenid() 関數(shù) は、ファイル WxPay.JsApiPay.php で定義されています。ファイル
public function GetOpenid() { //通過code獲得openid if (!isset($_GET['code'])){ //觸發(fā)微信返回code碼 $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']); $url = $this->CreateOauthUrlForCode($baseUrl); Header("Location: $url"); exit(); } else { //獲取code碼,以獲取openid $code = $_GET['code']; $openid = $this->getOpenidFromMp($code); return $openid; } }
$baseUrl は、実際にはこのページに戻るためのものです。 CreateOauthUrlForCode() 関數(shù)を引き続き追跡できます。実際、これは WeChat の Auth2.0 を通じて Openid を取得するためです
參考リンク: http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
。これには WeChat を使用する必要があります。Web 認証 インターフェース も設定されています。
Openid を取得したら、WeChat Pay の統(tǒng)合注文インターフェイスを呼び出すことができます。ファイル jsapi.php に戻り、次のコード
$input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = WxPayApi::unifiedOrder($input); echo '<font color="#f00"><b>統(tǒng)一下單支付單信息</b></font><br/>'; printf_info($order); $jsApiParameters = $tools->GetJsApiParameters($order);
內(nèi)のコード:
$input->SetAttach("test");
値を $input->SetAttach("test this isattach"); に変更すると、その背後にはバグがあります。さらに、実際には、このパラメータは必要ないので、簡単に削除できます。
コード:
$input->SetNotify_url(http://paysdk.weixin.qq.com/example/notify.php);
は、支払い結(jié)果通知を受信するために設定されたURLです。これはデフォルトのデモリンクです:
$input->SetNotify_url(dirname('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']).'/notify.php');
當然你也可以選擇直接寫死。
其中的函數(shù) unifiedOrder($input) 可以到WxPay.Api.php 中文件跟蹤,其實就是調(diào)用統(tǒng)一下單接口。
在 WxPay.Api.php 中需要更改的一處代碼是:
//異步通知url未設置,則使用配置文件中的url if(!$inputObj->IsNotify_urlSet()){ $inputObj->SetNotify_url(WxPayConfig::NOTIFY_URL);//異步通知url }
就是當沒設置 notifyUrl 的時候回去配置文件中找,但是配置文件中根本沒有設置。
所以你可以選擇在 配置文件WxPay.Config.php 中加上這個配置,也可以直接寫一個默認的notify鏈接。
函數(shù) GetJsApiParameters() 是獲取jsApi支付的參數(shù)給變量 $jsApiParameters 方便在下面的Js中調(diào)用
jsapi.php 中js的代碼:
function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } }
其中點擊立即支付按鈕調(diào)用的就是 callpay() 函數(shù),他有會調(diào)用jsApiCall() 函數(shù)打開支付程序。
此后輸入密碼完成支付。
在完成支付頁面點擊完成會回到這個支付頁面,并彈出 支付成功的提示框
這個其實就是 js函數(shù) jsApiCall 里面的alter 彈出的對話框
其中 res.err_msg 為get_brand_wcpay_request:ok 表明前端判斷的支付成功,我們可以根據(jù)這個將支付跳轉(zhuǎn)到成功頁面。
但是這個并不可信。確認是否支付成功還是應當 通過notify.php 處理業(yè)務邏輯。
5. 支付結(jié)果通知 notify.php
其實這個頁面最主要的代碼就兩行
$notify = new PayNotifyCallBack(); $notify->Handle(false);
其中大部分邏輯在 Handle 函數(shù)中處理 文件 WxPay.Notify.php
final public function Handle($needSign = true) { $msg = "OK"; //當返回false的時候,表示notify中調(diào)用NotifyCallBack回調(diào)失敗獲取簽名校驗失敗,此時直接回復失敗 $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); if($result == false){ $this->SetReturn_code("FAIL"); $this->SetReturn_msg($msg); $this->ReplyNotify(false); return; } else { //該分支在成功回調(diào)到NotifyCallBack方法,處理完成之后流程 $this->SetReturn_code("SUCCESS"); $this->SetReturn_msg("OK"); } $this->ReplyNotify($needSign); }
主要代碼:
$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);
跟蹤函數(shù) notify 文件WxPay.Api.php
public static function notify($callback, &$msg) { //獲取通知的數(shù)據(jù) $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //如果返回成功則驗證簽名 try { $result = WxPayResults::Init($xml); } catch (WxPayException $e){ $msg = $e->errorMessage(); return false; } return call_user_func($callback, $result); }
通過 $GLOBALS[‘HTTP_RAW_POST_DATA‘]; 獲取同志數(shù)據(jù) 然后 Init 函數(shù)驗證簽名等。驗簽成功運行代碼
return call_user_func($callback, $result);
即調(diào)用了一個回調(diào)函數(shù),NotifyCallBack() 函數(shù)并傳遞參數(shù) $result 在NotifyCallBack函數(shù)中會調(diào)用我們重寫的NotifyProcess()函數(shù)(此函數(shù)在notify.php 中被重寫)
NotifyProcess() 判斷也沒有問題就會 設置返回 success的xml信息
$this->SetReturn_code("SUCCESS"); $this->SetReturn_msg("OK");
并最終調(diào)用函數(shù) $this->ReplyNotify($needSign); echo success的結(jié)果
函數(shù)ReplyNotify 需要修改一處代碼:
final private function ReplyNotify($needSign = true) { //如果需要簽名 if($needSign == true && $this->GetReturn_code($return_code) == "SUCCESS") { $this->SetSign(); } WxpayApi::replyNotify($this->ToXml()); } $this->GetReturn_code($return_code) == "SUCCESS")
改為
$this->GetReturn_code() == "SUCCESS")
即可。
這樣整個流程就結(jié)束了。上面提到了 傳遞訂單參數(shù)
$input->SetAttach("test");
如果我設置 值為 test this is attach (其實只要有空格就會存在bug)
如圖 傳遞的訂單信息
可以看到 attach 信息正常,當然支付也是正常的沒有任何問題。
但是發(fā)現(xiàn)總是會收到notify 通知,即意味著沒有返回給微信服務器正確的結(jié)果通知。
打印服務器發(fā)來的通知數(shù)據(jù)
可以看到 attach 是 test+this+is+attach 即空格被轉(zhuǎn)化為加號
打印接收到的簽名和程序算出來的簽名發(fā)現(xiàn) 簽名不同,即認為接收結(jié)果異常。
所以我們要是想使用attach 這個值就不能有空格,要么干脆不使用這個參數(shù)
(等待微信修復這個bug, 也可能是我這邊有哪個地方不會? - -#)
這樣 微信支付的 JsApi支付就大致分析完成了。
以上がWeChat決済PHP SDKのWeChatパブリックアカウント決済実裝コードについての詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

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

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

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

SublimeText3 中國語版
中國語版、とても使いやすい

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

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

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