微信支付

公眾號支付是指在微信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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容