微信支付JsAPI

https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip
下載獲取微信支付demo壓縮包

打開壓縮包,並將其中 WxpayAPI_php_v3\example下的
jsapi.php
log.php
WxPay.JsApiPay.php
WxPay.MicroPay.php
WxPay.NativePay.php
解壓縮到根目錄 tellingtent/

打開
WxPay.JsApiPay.php
WxPay.MicroPay.php
WxPay.NativePay.php
將其中涉及調用
../lib/......
路徑的改爲
lib/......

而後便可將微信支付demo壓縮包中WxpayAPI_php_v3下的lib文件夾也解壓縮到根目錄 tellingtent/

修改 tellingtent/lib/WxPay.Config.php 如下內容
const APPID = 'wx6385582ec2cc9108';//wx426b3015555a46be
const MCHID = '1226119502';//1900009851
const KEY = '8eujY70kmgkseu274980kH9e0uri78kd';//8934e7d15453e97507ef794cf7b0519d
const APPSECRET = '7813490da6f1265e4901ffb80afaa36f';//7813490da6f1265e4901ffb80afaa36f
這些內容從公衆號中獲取

而後登錄公衆號,設置支付受權目錄,這裏是
http://anting.imagchina.com/tellingtent/
tellingtent/便是存放支付文件的根目錄

而且在設置支付受權目錄中下載一個MP_verify_2YfIdHkI4jOcQ30B.txt文件,存放到根目錄 tellingtent/ 中

打開jsapi.php
將其中獲取openid的
$tools->GetOpenid();
換成已獲取的openid,這裏是
osKoBjx_vTKa67vgoJjH4Dg81tRk
在這裏暫時不借用官方的獲取openid方法

在微信中打開
http://anting.imagchina.com/tellingtent/jsapi.php
便可進行支付

jsapi.php裏的支付回調單號SetOut_trade_no自定義賦值,但不能重複,在支付成功後,微信會回調jsapi.php裏SetNotify_url設定的路徑,回調信息中有對應付款成功的out_trade_no單號

最好在調用微信支付的js方法callpay()以前,先建立本地的訂單信息,保存out_trade_no單號,而且設定支付狀態爲未支付
在設定好的回調頁面中根據支付成功的out_trade_no單號修改數據庫中對應訂單的付款狀態爲支付成功



支付成功後回調頁面內容
PHP非以傳統$_GET$_POST方式獲取微信回調內容,以 file_get_contents('php://input'); 獲取
例
<?php
//$postStr獲取到的是格式化字符串內容
$postStr = file_get_contents('php://input');
?><xml>
<appid><![CDATA[wx6385582ec2cc9108]]></appid> <attach><![CDATA[嘉亭薈移動故事屋]]></attach>
<bank_type><![CDATA[CMB_DEBIT]]></bank_type> <cash_fee><![CDATA[8000]]></cash_fee>
<fee_type><![CDATA[CNY]]></fee_type> <is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[1226119502]]></mch_id> <nonce_str><![CDATA[d0hh1c3m1ynd52qhajgsk6jwqcvkez0p]]></nonce_str>
<openid><![CDATA[osKoBj2iVkFtf8-MBcHXyWkaXT4k]]></openid> <out_trade_no><![CDATA[122611950220160923172852]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[D4F31510A3EED6F54AB0B4A02D772C98]]></sign> <time_end><![CDATA[20160923173254]]></time_end>
<total_fee>8000</total_fee> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[4006602001201609234721061954]]></transaction_id>
</xml>


須要手動截取獲取其中想要信息值
如想要out_trade_no與transaction_id的值
例
<?php
$postStr = file_get_contents('php://input');

$trade_noarr = explode ( "out_trade_no><![CDATA[", $postStr );
$trade_noarr = explode ( "]]></out_trade_no", $trade_noarr [1] );
$out_trade_no = $trade_noarr [0];

$arr = explode ( "transaction_id><![CDATA[", $postStr );
$arr = explode ( "]]></transaction_id", $arr [1] );
$transaction_id = $arr [0];

// 便可根據返回的訂單號修改數據庫中對應訂單信息
?>

微信成功後同一單號會屢次回調信息內容,通常三次







設定的支付路徑是根目錄 tellingtent/ 不變

能夠把以前的
jsapi.php
log.php
WxPay.JsApiPay.php
WxPay.MicroPay.php
WxPay.NativePay.php
lib文件夾
單獨放到某個目錄下面
例如這裏放到根目錄下的
tellingtent/testpay
文件夾裏
把支付樣例jsapi.php文件中的html部分代碼提取出來單獨存放在根目錄下的某個文件內,這裏是
tellingtent/testpay.php
代碼內容
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script type="text/javascript" src="./testpay/jquery.min.js"></script>
<title>微信支付樣例-支付</title>
<script type="text/javascript">
    var jsApiParameters = '';
    $.post("./testpay/jsapi.php",{},function(data){
        jsApiParameters = data;
        alert(jsApiParameters);
    },"json")
    
    //調用微信JS api 支付
        function jsApiCall()
        {
            if(jsApiParameters){
                WeixinJSBridge.invoke(
                    'getBrandWCPayRequest',
                    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>
    <br />
    <font color="#9ACD32"><b>該筆訂單支付金額爲<span
            style="color: #f00; font-size: 50px">1分</span></b></font>
    <br />
    <br />
    <div align="center">
        <button
            style="width: 210px; height: 50px; border-radius: 15px; background-color: #FE6714; border: 0px #FE6714 solid; cursor: pointer; color: white; font-size: 16px;"
            type="button" onclick="callpay()">當即支付</button>
    </div>
</body>
</html>

原頁面直接經過php獲取的jsApiParameters,改成經過ajax獲取
這樣tellingtent/testpay文件夾內的原文件jsapi.php裏只剩下以前的php代碼
<?php 
ini_set('date.timezone','Asia/Shanghai');
//error_reporting(E_ALL);
require_once "lib/WxPay.Api.php";
require_once "WxPay.JsApiPay.php";
require_once 'log.php';
//初始化日誌
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);

//打印輸出數組信息
function printf_info($data)
{
    foreach($data as $key=>$value){
        //echo "<font color='#00ff55;'>$key</font> : $value <br/>";
    }
}

//①、獲取用戶openid
$tools = new JsApiPay();
$openId = 'osKoBjx_vTKa67vgoJjH4Dg81tRk';//$tools->GetOpenid();

//②、統一下單
$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>統一下單支付單信息</b></font><br/>';
printf_info($order);
$jsApiParameters = $tools->GetJsApiParameters($order);

echo $jsApiParameters;exit;

//獲取共享收貨地址js函數參數
//$editAddress = $tools->GetEditAddressParameters();

//③、在支持成功回調通知中處理成功以後的事宜,見 notify.php
/**
 * 注意:
 * 一、當你的回調地址不可訪問的時候,回調通知會失敗,能夠經過查詢訂單來確認支付是否成功
 * 二、jsapi支付時須要填入用戶openid,WxPay.JsApiPay.php中有獲取openid流程 (文檔能夠參考微信公衆平臺「網頁受權接口」,
 * 參考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
 */
?>

如此微信中訪問
http://anting.imagchina.com/tellingtent/testpay.php
也能夠進行支付
只要支付調用js的文件在支付受權指定目錄中便可