中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信開發中如何實現微信支付

發布時間:2021-09-10 18:08:10 來源:億速云 閱讀:171 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關微信開發中如何實現微信支付的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、 微信后臺設置

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常量。

三、使用官方V3.7的示例代碼

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>&nbsp;</p>
    <p>&nbsp;</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>

四、使用官方V3的示例代碼

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,代碼一下就通了)

感謝各位的閱讀!關于“微信開發中如何實現微信支付”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

木兰县| 社会| 黄陵县| 昂仁县| 巴塘县| 凤冈县| 汝城县| 微山县| 明水县| 合水县| 来安县| 赞皇县| 中方县| 岢岚县| 潜江市| 桑植县| 介休市| 巨野县| 屏东市| 白城市| 皋兰县| 徐州市| 望城县| 栾川县| 合阳县| 平利县| 嵩明县| 南江县| 博罗县| 台山市| 平舆县| 昆山市| 博野县| 新津县| 安福县| 江山市| 育儿| 龙川县| 漯河市| 新疆| 资阳市|