公眾號支付是指在微信app中訪問的頁面通過js直接調起微信支付;
一:設置域名
登錄微信公眾平臺;
微信支付中設置支付授權目錄;把域名改為自己的;
注意最后是有一個斜線的/
支付授權目錄是 ?控制器的, ? ,精準到? ? ?weixinpay控制器? ?
設置授權域名;??
二:導入sdk
/ThinkPHP/Library/Vendor/Weixinpay
好吧;還是沒忍住要吐槽;鵝廠的sdk那酸爽誰用誰知道;項目中的sdk是我根據官方文檔重構精簡打造而成的;
需要注意的是170行處的商品數據需要根據業務實際情況從數據庫中獲??;
根據訂單號, 查出必要的數據,放入,?
必須是查出來的,不能直接編輯
z$out_trade_no ? 這個是傳過來的單號,根據單號去查自己的訂單表,查出 ?下面所需要的數據
```
'10$openid=$result['openid'];
//訂單數據請根據訂單號out_trade_no從數據庫中查出實際的body、total_fee、out_trade_no、product_id
$order=array(
'body'=>'test',//商品描述(需要根據自己的業務修改)
'total_fee'=>1,//訂單金額以(分)為單位(需要根據自己的業務修改)
'out_trade_no'=>$out_trade_no,//訂單號(需要根據自己的業務修改)
'product_id'=>'1',//商品id(需要根據自己的業務修改)
'trade_type'=>'JSAPI',//?JSAPI公眾號支付
'openid'=>$openid//獲取到的openid
);'
```
三:配置項
/Application/Common/Conf/config.php
```
7'WEIXINPAY_CONFIG'=>array(
'APPID'=>'',//微信支付APPID
'MCHID'=>'',//微信支付MCHID商戶收款賬號
'KEY'=>'',//微信支付KEY
'APPSECRET'=>'',//公眾帳號secert?(公眾號支付專用)
'NOTIFY_URL'=>'http://baijunyao.com/Api/Weixinpay/notify',?//接收支付狀態的連接
),
```
在微信公眾平臺和微信支付平臺湊齊上面這些參數;
四:支付方法
/Application/Api/Controller/WeixinpayController.class.php
```
*公眾號支付必須以get形式傳遞out_trade_no參數
*示例請看/Application/Home/Controller/IndexController.class.php
*中的wexinpay_js方法
*/
publicfunctionpay(){
//導入微信支付sdk
Vendor('Weixinpay.Weixinpay');
$wxpay=new\Weixinpay();
//獲取jssdk需要用到的數據
$data=$wxpay->getParameters();
//將數據分配到前臺頁面
$assign=array(
'data'=>json_encode($data)
);
$this->assign($assign);
$this->display();
}
```
需要html的配合:/tpl/Api/Weixinpay/pay.html
```支付展示頁
購買button>
function?onBridgeReady(){
var?data={$data};
WeixinJSBridge.invoke(
'getBrandWCPayRequest',?data,
function(res){
if(res.err_msg?==?"get_brand_wcpay_request:ok"?)?{
//使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對可靠。
}else{
alert(res.err_code+res.err_desc+res.err_msg);?//顯示錯誤信息
}
}
);
}
if?(typeof?WeixinJSBridge?==?"undefined"){
if(?document.addEventListener?){
document.addEventListener('WeixinJSBridgeReady',?onBridgeReady,?false);
}else?if?(document.attachEvent){
document.attachEvent('WeixinJSBridgeReady',?onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady',?onBridgeReady);
}
}else{
onBridgeReady();
}
```
調用示例:/Application/Home/Controller/IndexController.class.php中的wexinpay_js方法
```項目訂單提交的控制器
/**
*微信公眾號jssdk支付
*/
publicfunctionwexinpay_js(){
//此處根據實際業務情況生成訂單然后拿著訂單去支付
//用時間戳虛擬一個訂單號(請根據實際業務更改)
$out_trade_no=time();
//組合url
$url=U('Api/Weixinpay/pay',array('out_trade_no'=>$out_trade_no));
//前往支付
redirect($url);
}
```
五:異步接收通知
/Application/Api/Controller/WeixinpayController.class.php
支付成功時 ? 走的判斷,
```
/**
*?notify_url接收頁面
*/
publicfunctionnotify(){
//導入微信支付sdk
Vendor('Weixinpay.Weixinpay');
$wxpay=new\Weixinpay();
$result=$wxpay->notify();
if($result)?{
//驗證成功修改數據庫的訂單狀態等$result['out_trade_no']為訂單id
}
}
```
//*********************************增加curl_get_contents函數的分割線****************************
如果是整合到自己的項目中;則需要在自己的公共函數中增加curl_get_contents;
/Application/Common/Common/function.php
```公共方法內加入,直接復制進去就ok
/**
*使用curl獲取遠程數據
*?@param??string?$url?url連接
*?@return?string獲取到的數據
*/
functioncurl_get_contents($url){
$ch=curl_init();
curl_setopt($ch,?CURLOPT_URL,$url);//設置訪問的url地址
//?curl_setopt($ch,CURLOPT_HEADER,1);???????????????//是否顯示頭部信息
curl_setopt($ch,?CURLOPT_TIMEOUT,?5);//設置超時
curl_setopt($ch,?CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);//用戶訪問代理User-Agent
curl_setopt($ch,?CURLOPT_REFERER,$_SERVER['HTTP_HOST']);//設置referer
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//跟蹤301
curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?1);//返回結果
$r=curl_exec($ch);
curl_close($ch);
return$r;
}
```
```
導入的 ?sdk ? 164 行, ?更換自己 ? 項目的 控制器的目錄地址
取消 tp的 ?偽靜態 ?后綴, ?公共config ? ? 不取消,它會大U 自帶 ?html
注意? url 訪問模式,必須是 2? ? ? ? ? ? ? ? ? ? 'URL_MODEL' => 2,
導入的微信cdk? weixinpay? ?170? ?必須是? 查出的數據 不能直接編輯
調試模式不能關, 只能關圖標, ? 關調試 ?支付則不能用, ? 并不知道是什么原因
密碼:figq