thinkphp整合系列之微信公眾號支付
公眾號支付是指在微信app中訪問的頁面通過js直接調起微信支付;
因此頁面必須是在微信中開啟的;
示例專案:https://github.com/baijunyao/thinkphp-bjyadmin
一:設定域名
登入微信公眾平臺;
微信支付中設定支付授權目錄;把域名改為自己的;
注意最後是有一個斜線的 /
設定授權域名;
二:匯入sdk
/ThinkPHP/Library/Vendor/Weixinpay
好吧;還是沒忍住要吐槽;鵝廠的sdk那酸爽誰用誰知道;專案中的sdk是我根據官方文件重構精簡打造而成的;
需要注意的是170行處的商品資料需要根據業務實際情況從資料庫中獲取;
$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
'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方法
*/
public function pay(){
// 匯入微信支付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
呼叫示例:/Application/Home/Controller/IndexController.class.php 中的wexinpay_js方法
/**
* 微信 公眾號jssdk支付
*/
public function wexinpay_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接收頁面
*/
public function notify(){
// 匯入微信支付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
/**
* 使用curl獲取遠端資料
* @param string $url url連線
* @return string 獲取到的資料
*/
function curl_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;
}
//*************************關於簽名錯誤的補充*********************************
如果出現簽名錯誤;
可以使用官方的 微信公眾平臺支付介面除錯工具
跟自己生產的簽名對比;
然後對比配置;查詢不一致的地方;
//*****************關於不知道怎麼檢視非同步發過來的資料的補充*****************
2016.10.28:
好多童鞋在問支付後;不知道怎麼檢視接收到的支付狀態通知;
這裡做個補充;首先;我們的伺服器必須是外網可以正常訪問到的;
必須注意不能有 登入或者許可權之類的攔截;
另外補充一個簡單的檢視收到的內容的方法用於測試;
五:非同步接收通知
/Application/Api/Controller/WeixinpayController.class.php
/**
* notify_url接收頁面
*/
public function notify(){
// ↓↓↓下面的file_put_contents是用來簡單檢視非同步發過來的資料 測試完可以刪除;↓↓↓
// 獲取xml
$xml=file_get_contents('php://input', 'r');
//轉成php陣列 禁止引用外部xml實體
libxml_disable_entity_loader(true);
$data= json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
file_put_contents('./notify.text', $data);
// ↑↑↑上面的file_put_contents是用來簡單檢視非同步發過來的資料 測試完可以刪除;↑↑↑
// 匯入微信支付sdk
Vendor('Weixinpay.Weixinpay');
$wxpay=new \Weixinpay();
$result=$wxpay->notify();
if ($result) {
// 驗證成功 修改資料庫的訂單狀態等 $result['out_trade_no']為訂單id
}
}
相關文章
- 微信支付V3微信公眾號支付PHP教程(thinkPHP5公眾號支付)/JSSDK的使用PHPJS
- 微信公眾號支付全解析
- 微信公眾號支付踩坑記
- thinkphp整合系列之微信退款PHP
- 微信sdk 公眾號 微信支付 NFC 坑&筆記筆記
- 微信公眾號支付開發手記(node)
- 微信公眾號支付實現詳解(前端)前端
- 微信開發之公眾號
- Laravel+easywechat 實現公眾號微信支付Laravel
- vue專案使用微信公眾號支付總結Vue
- 微信公眾號支付開發全過程(Java 版)Java
- thinkphp5.0.11開發微信公眾號通用系統PHP
- 微信的三種支付方式接入:APP支付、公眾號支付、掃碼支付APP
- 微信公眾號開發之坑(一)
- 微信公眾號智慧回答
- 微信公眾號開發
- 微信公眾號系統
- 微信公眾號--入門
- 微信公眾號開發之客服訊息
- 微信公眾號接入月之暗面Kimi
- 微信公眾號投票活動製作教程 微信公眾號投票怎麼弄?
- Python開發微信公眾號後臺(系列二)Python
- 如何排版 微信公眾號「程式碼塊」之 MarkEditor
- 微信公眾號之自動回覆文字 -- PHPPHP
- 微信公眾號開發-分享
- 微信公眾號 檢視地址
- 微信公眾號介面導讀
- .net開發微信公眾號
- 【前端】微信公眾號推薦前端
- SAP系統和微信整合的系列教程之二:如何通過微信公眾號消費APIAPI
- Python 抓取微信公眾號賬號資訊Python
- [微信公眾號] 配置與應用
- 【微信公眾號】配置與應用
- 爬取微信公眾號文章工具
- 微信公眾號-入門的坑
- 微信公眾號下發紅包 -- PHPPHP
- Nodejs微信公眾號開發NodeJS
- 微信公眾號自動回覆_JavaJava