您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關微信開發中如何實現微信支付的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、 微信后臺設置
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></h5>
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上。于是登入商戶平臺,因為不是管理員,又跟產品MM要了手機驗證碼,重新設置了支付key,代碼一下就通了)
感謝各位的閱讀!關于“微信開發中如何實現微信支付”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。