1. 程式人生 > >ThinkPHP5 整合微信掃碼支付

ThinkPHP5 整合微信掃碼支付

摘要

  • 為了便於微信開發,此處在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
    }

附錄