業務流程時序圖
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';
//模式一
/**
?>
{{ 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; }