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


業務流程時序圖

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

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

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

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

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

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

(7)商戶后台系統得到交易會話標識prepay_id(2小時內有效)。

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

(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

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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM