ThinkPHP5 整合微信掃碼支付
阿新 • • 發佈:2018-12-30
摘要
- 為了便於微信開發,此處在ThinkPHP5.0 框架下整合了微信掃碼支付的功能,測試需要外網專案部署.
功能開發
微信支付SDK整理移植
- 一般會進行原生開發,那麼就可以直接下載開發文件中的PHP-SDK,此處的程式碼進行了整理。
- 需要將 ..\application\extend 目錄下的 wxpay 對應移植到自己的專案目錄中.
配置 WxPayConfig
- 定位到 ..\application\extend\wxpay\WxPayConfig.php 檔案,配置微信支付的四個重要資料.
- 注意:NOTIFY_URL 要寫絕對路徑
/**
* 微信公眾號資訊配置
*
* APPID:繫結支付的APPID(必須配置,開戶郵件中可檢視)
*
* MCHID:商戶號(必須配置,開戶郵件中可檢視)
*
* KEY:商戶支付金鑰,參考開戶郵件設定(必須配置,登入商戶平臺自行設定)
* 設定地址:https://pay.weixin.qq.com/index.php/account/api_cert
*
* APPSECRET:公眾帳號secert(僅JSAPI支付的時候需要配置, 登入公眾平臺,進入開發者中心可設定),
* 獲取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
* @var string
*/
生成二維碼 url
- 以參考專案為例,在 ..\application\index\controller\Wxpay.php 中添加了index()方法,用於業務處理(例如獲取post/get請求資料,並進行商品資訊的獲取等)以及呼叫微信介面生成二維碼.
- 得到的qrCode_url 需要賦值到前端頁面標籤的url
- 注意外網可訪問的要求.
public function index()
{
//TODO 進行業務處理
//TODO 生成二維碼
$product_id = time()+1;
$notify = new NativePay();
$input = new WxPayUnifiedOrder();
$input->setBody("product_name");
$input->setAttach("xxx");
//$input->setOutTradeNo(WxPayConfig::MCHID.date("YmdHis"));
$input->setOutTradeNo($product_id);
$input->setTotalFee("1");//以分為單位
$input ->setTimeStart(date("YmdHis"));
$input->setTimeExpire(date("YmdHis", time() + 600));
$input->setGoodsTag("test");
$input->setNotifyUrl(wxPayConfig::NOTIFY_URL);
$input->setTradeType("NATIVE");
//$product_id 為商品自定義id 可用作訂單ID
$input->setProductId($product_id);
$result = $notify->getPayUrl($input);
if (empty($result['code_url'])){
$qrCode_url = '';
}else{
$qrCode_url = $result["code_url"];
}
return $this->fetch('',[
'qrCode_url' => $qrCode_url,
]);
}
回撥函式的編輯
- 以參考專案為例,對應於NOTIFY_URL 的設定,本人在 ..\application\index\controller\Wxpay.php 中添加了notify()方法。
- 用於非同步接收微信支付後的邏輯處理
- file_put_contents(‘/tmp/2.txt’,$wxData,FILE_APPEND); 程式碼是為了將微信支付的反饋資訊寫入本地檔案,便於分析處理.
/**
* 微信支付 回撥邏輯處理
* @return string
*/
public function notify(){
$wxData = file_get_contents("php://input");
//file_put_contents('/tmp/2.txt',$wxData,FILE_APPEND);
try{
$resultObj = new WxPayResults();
$wxData = $resultObj->Init($wxData);
}catch (\Exception $e){
$resultObj ->setData('return_code','FAIL');
$resultObj ->setData('return_msg',$e->getMessage());
return $resultObj->toXml();
}
if ($wxData['return_code']==='FAIL'||
$wxData['return_code']!== 'SUCCESS'){
$resultObj ->setData('return_code','FAIL');
$resultObj ->setData('return_msg','error');
return $resultObj->toXml();
}
//TODO 根據訂單號 out_trade_no 來查詢訂單資料
$out_trade_no = $wxData['out_trade_no'];
//此處為舉例
$order = model('order')->get(['out_trade_no' => $out_trade_no]);
if (!$order || $order->pay_status == 1){
$resultObj ->setData('return_code','SUCCESS');
$resultObj ->setData('return_msg','OK');
return $resultObj->toXml();
}
//TODO 資料更新 業務邏輯處理 $order
}