PHP集成微信支付(APP支付)

配置參數

  • appid

appid 是微信公衆帳號或開放平臺 APP 的惟一標識,在公衆平臺申請公衆帳號或者在開放平臺申請APP帳號後,微信會自動分配對應的 appid,用於標識該應用。可在微信公衆平臺-->開發者中心查看,商戶的微信支付審覈經過郵件中也會包含該字段值(APPID)。前端

  • mch_id

商戶申請微信支付後,由微信支付分配的商戶收款帳號,郵件中的參數爲微信支付商戶號。git

  • key

交易過程生成簽名的密鑰,僅保留在商戶系統和微信支付後臺,不會在網絡中傳播。商戶妥善保管該 Key,切勿在網絡中傳輸,不能在其餘客戶端中存儲,保證 key 不會被泄漏。商戶可根據郵件提示登陸微信商戶平臺進行設置。也可按一下路徑設置:微信商戶平臺(pay.weixin.qq.com)-->帳戶設置--> API 安全-->密鑰設置。郵件中參數 API 密鑰。github

  • secret

AppSecret 是 APPID 對應的接口密碼,用於獲取接口調用憑證 access_token 時使用。郵件中參數 Appsecretjson

安裝 PHP 擴展

這裏推薦一個很好用的支付擴展包,它集成了支付寶支付和微信支付。
yansongda/pay安全

composer require yansongda/pay -vvv

微信支付簡單使用

<?php
namespace XXX\Api;

use Yansongda\Pay\Pay;

class PayTool
{
    /* 微信 APP 支付配置參數*/
    protected $wxConfig = [
        'appid' => 'wx18xxxxxxxxxxxxx',
        'mch_id' => '151xxxxxxxxx',
        'key' => '267xxxxx7b89xxxxxxxxxxxxxx',
        'notify_url' => 'http://xxx.xxx.xxx/xxx/PayTool.wxVerify'
    ];

    protected function wxPay()
    {
        return Pay::wechat($this->wxConfig);
    }
    
    /* 生成帶簽名的客戶端訂單信息*/
    public function getSign($type = 'wx')
    {
        try {
            /* 訂單號*/
            $out_trade_no = 'wx'.date('YmdHis');

            switch ($type) {
                case 'wx':
                    $order = [
                        'out_trade_no' => $out_trade_no,
                        /* 金額,單位:分*/
                        'total_fee' => '1',
                        /* 商品描述*/
                        'body' => 'APP名-商品描述',
                    ];

                    $wxPay = self::wxPay();

                    $pay = $wxPay->app($order);
                    break;
                default:
                    throw new \Exception('支付方式異常');
            }

            return [
                'status' => 200,
                'result' => json_decode($pay->getContent(), true)
            ];
        } catch (\Exception $e) {
            return ['status' => 500, 'result' => $e->getMessage()];
        }
    }

    /* 微信支付結果異步通知*/
    public function wxVerify()
    {
        try {
            $wxPay = self::wxPay();
            $result = $wxPay->verify();

            if ($result) {
                $response = $wxPay->success();
                
                /* 日誌記錄*/
                $wxPayLogs = new WXPayLogs();
                $wxPayLogs->content = $response->getContent();

                /* all 字段中包括了詳細的返回信息*/
                $wxPayLogs->all = $result->toArray();
                $wxPayLogs->save();

                /* 返回成功參數給微信*/
                return $response->send();
            }
        } catch (\Exception $e) {
            $wxPayLogs = new WXPayLogs();
            $wxPayLogs->content = $e->getMessage() ;
            $wxPayLogs->save();
        }
    }
}

後續

建議查看 yansongda/pay 的文檔, 並結合本身的業務需求進行整合。微信

Note:網絡

  • 須要可以正確處理第三方重複的支付結果通知。
  • 異步通知除了簽名驗證,必須校驗返回的訂單金額是否與商戶側的訂單金額一致。
  • 能夠查詢第三方該訂單的支付狀態,來返回給前端。
  • 用戶支付失敗時,從新生成訂單的邏輯。(關閉失敗訂單)
  • 當心謹慎。
相關文章
相關標籤/搜索