Laravel 5.3 + 微信支付SDK v3.0.1 + 微信掃碼支付

業務流程時序圖
php

業務流程說明:
(1)商戶後臺系統根據微信支付規定格式生成二維碼(規則見下文),展現給用戶掃碼。html

(2)用戶打開微信「掃一掃」掃描二維碼,微信客戶端將掃碼內容發送到微信支付系統。數據庫

(3)微信支付系統收到客戶端請求,發起對商戶後臺系統支付回調URL的調用。調用請求將帶productid和用戶的openid等參數,並要求商戶系統返回交數據包,詳細請見"本節3.1回調數據輸入參數"json

(4)商戶後臺系統收到微信支付系統的回調請求,根據productid生成商戶系統的訂單。api

(5)商戶系統調用微信支付【統一下單API】請求下單,獲取交易會話標識(prepay_id)安全

(6)微信支付系統根據商戶系統的請求生成預支付交易,並返回交易會話標識(prepay_id)。服務器

(7)商戶後臺系統獲得交易會話標識prepay_id(2小時內有效)。微信

(8)商戶後臺系統將prepay_id返回給微信支付系統。返回數據見"本節3.2回調數據輸出參數"app

(9)微信支付系統根據交易會話標識,發起用戶端受權支付流程。異步

(10)用戶在微信客戶端輸入密碼,確認支付後,微信客戶端提交支付受權。

(11)微信支付系統驗證後扣款,完成支付交易。

(12)微信支付系統完成支付交易後給微信客戶端返回交易結果,並將交易結果經過短信、微信消息提示用戶。微信客戶端展現支付交易結果頁面。

(13)微信支付系統經過發送異步消息通知商戶後臺系統支付結果。商戶後臺系統需回覆接收狀況,通知微信後臺系統再也不發送該單的支付通知。

(14)未收到支付通知的狀況,商戶後臺系統調用【查詢訂單API】。

(15)商戶確認訂單已支付後給用戶發貨。

微信基本參數配置:
1. 修改 \Desktop\WxpayAPI_php_v3.0.1\lib\WxPay.Config.php中的參數配置
//=======【基本信息設置】=====================================
//
/**
* TODO: 修改這裏配置爲您本身申請的商戶信息
* 微信公衆號信息配置
*
* 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
*/
const APPID = 'wx426b3015555a46be';
const MCHID = '1900009851';
const KEY = '8934e7d15453e97507ef794cf7b0519d';
const APPSECRET = '7813490da6f1265e4901ffb80afaa36f';
將上述幾個參數修改成你的微信公衆的相關信息
2.證書的更換,將Desktop\WxpayAPI_php_v3.0.1\cert\文件夾下的參數更換成相應公衆號的證書具體下載地址:商虎平臺 》 帳戶中心 》API安全 》API證書下載

3.受權域名的設置;在微信公衆號中設置網頁受權域名,JS接口安全域名,具體設置地址:公衆平臺》設置》公衆號設置》功能設置》JS接口安全域名設置,網頁受權域名:

TIP:設置域名的時候須要將一個驗證文件拷貝到域名訪問的根目錄,不然受權沒法經過:

4.在商戶平臺設置掃描回調URL, JSAPI支付受權目錄:具體以下

TIP:設置JSAPI支付受權目錄的時候須要注意,URL最後一個參數是能夠變化的,如 JSAPI支付受權目錄是 http://www.demo.com/wxpay/ ,那麼你能夠發起支付的路由是http://www.demo.com/wxpay/productID, productID能夠變化,可是若是發起支付路由是是http://www.demo.com/wxpay/productID/deeper,則微信可能會報錯「沒有受權的....."

項目目錄結構說明:

1.Controllers 文件夾中放置控制器
2.routes.php 設置路由信息
3.Wxpay 是 微信SDK
4.views 文件夾中放置顯示文件

功能實現:
1.顯示二維碼:
1.1控制器,WeiXinController.php
//獲取二維碼
public function qrcode(){
//簡單的頁面跳轉
return view('wexinPay.native');

}

1.2 Route路由
Route::get('qrcode','WeiXinController@qrcode');
1.3 View頁面的設置,native.blade.php來自微信SDK 》 example > native.php
<?php
ini_set('date.timezone','Asia/Shanghai');
//error_reporting(E_ERROR);

//這地方注意require_once的設置,base_path是獲取到項目的根目錄,後面路徑的設置根據我的項目結構改變
require_once base_path()."/app/Wxpay/lib/WxPay.Api.php";
require_once base_path()."/app/Wxpay/example/WxPay.NativePay.php";
require_once base_path().'/app/Wxpay/example/log.php';

//模式一
/**

  • 流程:
  • 一、組裝包含支付信息的url,生成二維碼
  • 二、用戶掃描二維碼,進行支付
  • 三、肯定支付以後,微信服務器會回調預先配置的回調地址,在【微信開放平臺-微信支付-支付配置】中進行配置
  • 四、在接到回調通知以後,用戶進行統一下單支付,並返回支付信息以完成支付(見:native_notify.php)
  • 五、支付完成以後,微信服務器會通知支付成功
  • 六、在支付成功通知中須要查單確認是否真正支付成功(見:notify.php)
    */
    $notify = new NativePay();
    $url1 = $notify->GetPrePayUrl("123456789");

?>

{{ json_encode($result) }}

自助售花系統
掃描支付模式一

模式一掃碼支付


TIP: $notify->GetPrePayUrl( ProductID );方法的具體實現參考微信SDK中的源碼

2.掃碼下單。
掃描支付二維碼,觸發掃碼回調URL , 該URL中使用統一接口下單:
2.1 Controller
public function qrcodeNotify(){

Log::info("qrcode notify.");

    $notify = new NativeNotifyCallBack();
    $notify->Handle(true);

    Log::info(json_encode($notify));

}

2.2 Route
Route::any('qrcodeNotify','WeiXinController@qrcodeNotify');
2.3回調函數的實現:
回調的實現 WxpayAPI_php_v3.0.1\example\native_notify.php

class NativeNotifyCallBack extends WxPayNotify
{
public function unifiedorder($openId, $product_id)
{
//統一下單
$input = new WxPayUnifiedOrder();
$input->SetBody("藍色妖姬");
$input->SetAttach("測試數據");
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
$input->SetTotal_fee("1");
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url(url('notify')); //這個URL是支付回調URL
$input->SetTrade_type("NATIVE");
$input->SetOpenid($openId);
$input->SetProduct_id($product_id);
$result = WxPayApi::unifiedOrder($input);
Log::DEBUG("unifiedorder:" . json_encode($result));
return $result;
}

3.支付回調的實現:
3.1 Controller

public function notify(){

    Log::info("pay notify.");

    $notify = new PayNotifyCallBack();
    $notify->Handle(false);

    Log::info(json_encode($notify));

}

3.2 ROUTE
Route::any('notify','WeiXinController@notify');
3.3 在回調函數中作相關處理

class PayNotifyCallBack extends WxPayNotify
{
//查詢訂單
public function Queryorder($transaction_id)
{
$input = new WxPayOrderQuery();
$input->SetTransaction_id($transaction_id);
$result = WxPayApi::orderQuery($input);

\Illuminate\Support\Facades\Log::info("paynotify.query:" . json_encode($result));

    if(array_key_exists("return_code", $result)
        && array_key_exists("result_code", $result)
        && $result["return_code"] == "SUCCESS"
        && $result["result_code"] == "SUCCESS")
    {
        // TODO
                    // 相關操做,保存相關數據,數據庫操做 .......
                    
        return true;
    }
    return false;
}
相關文章
相關標籤/搜索