一、微信後台設定
#1. 新增測試授權目錄和測試白名單:
#在微信後台,設定測試授權目錄,如xxx.sinaapp.com/example/,測試白名單中加入你的微訊號。
注意,這裡的「個人微訊號」既不是qq號也不是個人暱稱。而是登入微信後在「我」介面中的「微訊號」欄位的字串。
支付授權目錄設不設無所謂,因為我們只是測試。
2.清單內容
設定網頁授權網域:
在「開發者中心/介面權限表/網頁帳號/網頁授權取得使用者基本資訊」中進行設定。網頁授權域名設定為測試伺服器的域名,如:xxx.sinaapp.com,不需要http://。
1.下載憑證
在「帳號設定/API安全/API憑證」中下載。需要用到管理員的手機驗證碼。下載後的進行解壓縮,我們需要用到的是apiclient_key.pem和apiclient_cert.pem。
2.產生支付key
在「帳戶設定/API安全/API金鑰」中設定。支付key將在付款時用到,這個值就是原始碼設定檔中的KEY常數。
1、在Wxpay.pub.config.php修改配置,主要是:
const APPID //公众号中“开发者中心”看到的AppID const MCHID //微信支付商户资料审核成功邮件中的商户号 const KEY //你在商户平台中设置的支付key const APPSECRET //公众号中“开发者中心”看到的AppSecret const JS_API_CALL_URL //设置这个url,可在此页面中获得用户的openid。 //证书路径,注意应该填写绝对路径 const SSLCERT_PATH // apiclient_cert.pem文件url const SSLKEY_PATH // apiclient_key.pem文件url,如’/cert/ apiclient_key.pem’ const NOTIFY_URL //异步通知url,可使用demo中的notify_url.php
#2、修改官方程式碼中的bug:
如果出現「curl_setopt() expects parameter 2 to be long」錯誤,是因為WxPayPubHelper.php中有幾個地方將「curl_setopt」拼錯了,拼成「curl_setop ”,將其修改後即可。如果出現“curl_close(): 11 is not a valid”,則是因為錯誤地關閉了一個已經關閉的curl session,可以將curl_close()代碼加上如下判斷:
if(gettype($ch) == 'resource') curl_close($ch);
3、官方demo直接跑不通,我們需要自己搞定它。首先中index.php中增加一個連結:
<a href="pay.php"> 获取openid</a></h4>
3、 然後寫一個pay.php頁面,用於取得使用者openid並發起付款:
<?php /** * JS_API支付demo * ==================================================== * 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。 * 成功调起支付需要三个步骤: * 步骤1:网页授权获取用户openid * 步骤2:使用统一支付接口,获取prepay_id * 步骤3:使用jsapi调起支付 */ include_once ("WxPayPubHelper.php"); $jsApi = new JsApi_pub(); // =========步骤1:网页授权获取用户openid============ // 通过code获得openid if (! isset($_GET['code'])) { // 触发微信返回code码 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL); Header("Location: $url"); } else { // 获取code码,以获取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); } $goods = "test"; // 使用统一支付接口 $unifiedOrder = new UnifiedOrder_pub(); $unifiedOrder->setParameter("openid", "$openid"); // 用户openid $unifiedOrder->setParameter("body", "$goods"); // 商品描述 // 自定义订单号,此处仅作举例 $timeStamp = time(); $out_trade_no = WxPayConf_pub::APPID . "$timeStamp"; // 商户订单号 $unifiedOrder->setParameter("out_trade_no", "$out_trade_no"); $price = "1"; $unifiedOrder->setParameter("total_fee", "$price"); // 总金额 $unifiedOrder->setParameter("notify_url", WxPayConf_pub::NOTIFY_URL); // 通知地址 $unifiedOrder->setParameter("trade_type", "JSAPI"); // 交易类型 $prepay_id = $unifiedOrder->getPrepayId(); // =========步骤3:使用jsapi调起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); echo $jsApiParameters; ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1.0" /> <title>微信安全支付</title> <script type="text/javascript"> //调用微信JS api 支付 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(); } } </script> </head> <body> <p> </p> <p> </p> <p align="center"> <table border="1"> <tr> <td>openID</td> <td><?php echo $openid;?></td> </tr> <tr> <td>商品名称</td> <td><?php echo $goods;?></td> </tr> <tr> <td>订单号</td> <td><?php echo $out_trade_no;?></td> </tr> <tr> <td>prepay_id</td> <td><?php echo $prepay_id;?></td> </tr> <tr> <td>价格</td> <td><?php echo $price;?></td> </tr> </table> <button data-theme="b" type="button" onclick="callpay()">贡献一下</button> </p> </body> </html>
1、下載官方範例程式碼
最新SDK版本為V3.7,但我們不要去下V3.7的demo(那個例子跑不通),而是要去下V3的例子:
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
2、將demo解壓縮放到你的web根目錄下。例如,壓縮包解開後的目錄是WxpayAPI_php_v3,你要進入這個目錄後將所有檔案選中,然後複製到你的專案目錄中去。在這個目錄中有一個index.php,那麼到測試時候就需要存取 xxx.sinaapp.com/index.php。
3、將index.php中的標籤的url位址改為你伺服器上的url位址。
4、在你的微信中,隨便打開一個對話窗口,輸入index.php位址,如xxx.sinaapp.com/index.php,然後在對話視窗中點擊這個連結。會出現幾個按鈕,點「JSAPI支付」的按鈕,即可彈出支付金額為1分錢的窗口,輸入收貨人,支付。即會彈出支付成功介面。
到這一步,說明官方的支付代碼是基本上可用的,接下來,我們可以在它的基礎上修改成自己的程式碼。
5、替換cert目錄下的apiclient_key.pem和apiclient_cert.pem成你自己的憑證。
6、修改WxPay.Config.php中的以下幾項成你自己的:
const APPID //公众号中“开发者中心”看到的AppID const MCHID //微信支付商户资料审核成功邮件中的商户号 const KEY //你在商户平台中设置的支付key const APPSECRET //公众号中“开发者中心”看到的AppSecret
7、因為我們使用了sina的sae作為測試伺服器,sae不允許直接寫文件io,因此可以將官網程式碼中的檔案操作進行相應的修改(使用SaeStorage)。也就是需要修改log.php中的CLogFileHandler類別:
class CLogFileHandler implements ILogHandler { private $fn=null; private $ss=null; public function construct($file = '') { $this->fn=str_replace("../logs/", "", $file); $this->ss=new SaeStorage(); } public function write($msg) { $bytes = $this->ss->read('log', $this->fn); $str = $bytes; $this->ss->write('log', $this->fn, "$str\n$msg"); } public function destruct() { $fn=null; $ss=null; } }
8、如果出現簽名失敗的錯誤,我們可以使用微信的支付介面偵錯工具來進行測試:pay.weixin.qq.com/wiki /tools/signverify/。
這個工具是雖然是用來驗證「被掃支付」的,但透過它的「增加參數」按鈕和「刪除參數」按鈕,我們也可以用它來測試「公眾號支付」。例如,如果你提交的xml內容如下(可利用Log函數保存提交的xml內容到sae storage,然後下載日誌檔):
<xml><openid><![CDATA[om8888LTHBj99992Qgl_eUAOFgxs]]></openid><body><![CDATA[test]]></body><out_trade_no><![CDATA[wx111196222243ffa1143858aaaa]]></out_trade_no><total_fee>1</total_fee><notify_url><![CDATA[http://xxx.sinaapp.com/wxpay/demo/notify_url.php]]></notify_url><trade_type><![CDATA[JSAPI]]></trade_type><appid><![CDATA[wx000096104a431111]]></appid><mch_id>6666833333</mch_id><spbill_create_ip><![CDATA[10.211.76.107]]></spbill_create_ip><nonce_str><![CDATA[1agieoxyi8hc7e817rsnjlyn9lxmsnxj]]></nonce_str><sign><![CDATA[817034E4DE8E6067EB85CDF7318EF0A1]]></sign></xml>
則你可以中測試工具中這樣填寫表單:
點選「產生簽章」。將得到的簽章和日誌檔中的簽章進行比較,看是否一致,即可排除簽章演算法的問題。
如果2個簽章一致,可以肯定是支付key的問題。要嘛是產品MM搞錯了,要嘛是AppSecret和支付key搞反了(有一次產品MM告訴了為一個錯誤的支付key,浪費了我3天的時間!我反复確認了每一個代碼、每一次後台參數設定之後,最後用「支付介面調試工具」確認簽章無誤,問題就出在支付key上。 ,程式碼一下就通了)
【相關推薦】
1. 微信公眾號平台原始碼下載
#3. 詳解微信支付開發之刷卡支付實例
#4 . 詳解微信小程式支付功能開發錯誤總結
#以上是微信開發之微信支付的詳細內容。更多資訊請關注PHP中文網其他相關文章!