**目錄 (Table of Contents)**
[TOC]
## 微信公眾號內JS API 支付
我們模擬會員充值業務
### 步驟1、 后端統一下單 Order.php頁面
```PHP
//配置微信支付必要的參數
$wxConfigure = new WechatConfig();
$wxConfigure->setParameter("appid",YOUR_APPID);
$wxConfigure->setParameter("appsecret",YOUR_SECRET);
$wxConfigure->setParameter("mchid",YOUR_MCHID']);
$wxConfigure->setParameter("key",YOUR_KEY);
// 您的微信支付回調的地址,一般callback存放域名部分,這里我們假設域名是https://wx.endor-test.com/
$wxConfigure->setParameter("callback",YOUR_CALLBACK);
$jsPay = new JsPay($wechatConfig);
$orderSn = null;
$totalPrice = null;
$openid = null;
// 第一次發起支付請求,需要通過code去獲取openid
if(isset($_GET['code'] ))
{
$totalPrice = $_POST['totalPrice'] * 100; // 微信支付以分為單位
$out_trade_no = date("YmdHisms") ;
// 這一部分是本地服務器操作訂單的部分,根據實際情況自行處理
$orderInfo = [
'out_trade_no' => $out_trade_no,
'user_id' => $_POST['user_id'],// user_id是本地系統中用戶的id,根據實際情況獲取,這里只是舉例說明
'total_price'=>$totalPrice,
'order_status'=>'未支付',
'pay_time'=>'',
];
// 將orderInfo 保存到本地服務器數據庫,假設這里已經保存
// 生成獲取code的鏈接,假設當前下單的路由是 https://wx.endor-test.com/order.php
$callbackUrl = $wxConfigure->setParameter("callback");
// 生成的url需要將本地服務器訂單號帶上
$callbackUrl = $callbackUrl . "/order.php?out_trade_no=".$out_trade_no;
$url = $jsPay->createOauthUrlForCode($callbackUrl);
// 如果是SPA應用,這里將url返回給前端,前端通過location.href跳轉,跳轉后獲取
// 路由中的code,將下單接口的參數加上out_trade_no和code,再次調用相同的下單接口
// 發起請求
header("location:".$url);
}
else
{
// 跳轉后,url中是有code的參數的,將執行eles部分
$out_trade_no = $_GET['out_trade_no'];
$code = $_GET['code'] ;
// 通過 $out_trade_no 去本地服務器數據庫獲取訂單信息
// 假設我們已經拿到訂單信息 $orderInfo
$jsPay->setCode($code);
$openId = $jsPay->getOpenId();
if($openid == null)
{
// 出錯邏輯自行處理...
return ;
}
// 在這里完成微信公眾號統一訂單下單
$unifiedOrder = new UnifiedOrder($wxConfigure);
// 設置微信支付必填參數
$unifiedOrder->setParamter("openid",$openid);
$unifiedOrder->setParamter("body","會員VIP充值業務"); // 商品描述
$unifiedOrder->setParamter("total_fee",$orderInfo['total_price']);
$unifiedOrder->setParamter("out_trade_no",$out_trade_no );
$unifiedOrder->setParamter("out_trade_no",$out_trade_no );
$unifiedOrder->setParamter("out_trade_no",$out_trade_no );
$callbackUrl = $wxConfigure->setParameter("callback");
$unifiedOrder->setParamter("notify_url",$callbackUrl."/paycallback.php");//異步通知回調地址,假設我們這里是paycallback.php頁面
$unifiedOrder->setParamter("trade_type","JSAPI");
$prepay_id = $UnifiedOrder->getPrepayId(); // 獲取微信支付預訂單ID
// 使用jsapi 喚起支付
$jsPayParameters = $jsPay->getParameters(); // 獲取js支付對象的配置參數,前端使用
echo $jsPayParameters; // 將$jsPayParamters 返回給前端頁面
}
}
```
### 步驟2 、前端:發起支付請求 Order.html
>[info]這個html頁面也是微信官方給出的,關鍵點就是用Order.php中生成的$jsPayParameters 初始化
WeixinJSBridge.invoke()的第二個參數。
```Javascript
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
<title>微信安全支付</title>
<script type="text/javascript">
//調用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $jsApiParameters; ?>,
function(res){
if(res.err_code+res.err_desc+res.err_msg=="NaNget_brand_wcpay_request:ok"){
location=跳轉到您處理成功的顯示頁面
}
else
{
location=跳轉到您處理失敗的顯示頁面;
}
});
}
function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
window.onload = function(){
callpay();
}
</script>
</head>
<body>
</br></br></br></br>
</body>
</html>
```
### 步驟3 、后端:微信支付回調事件 paycallback.php
```PHP
//配置微信支付必要的參數
$wxConfigure = new WechatConfig();
$wxConfigure->setParameter("appid",YOUR_APPID);
$wxConfigure->setParameter("appsecret",YOUR_SECRET);
$wxConfigure->setParameter("mchid",YOUR_MCHID']);
$wxConfigure->setParameter("key",YOUR_KEY);
// 定義回調事件對象
$notify = new Notify($wxConfigure);
// 等待微信回調后,回執行您定義的閉包函數
$nofify->waitPaymentNotifyResults(function ($results,$status) use ($notify) {
if($status === "SUCCESS")
{
// 如果$status === "SUCCESS",說明本地服務器收到微信回調數據并鑒簽成功
// 數據以關聯數組形式存放在$results中,是NotifyData對象的關聯數組模式
file_put_contents("resultsdata.txt",var_export($results,true));
$out_trade_no = $results['out_trade_no'];
// 這里執行您的系統邏輯,如修改訂單狀態,設置會員VIP狀態等等...
// 最后,給微信返回 "success"
}
else
{
// 如果失敗,返回微信failed
echo "failed";
}
});
```
- 1、序言
- 1.1、更新說明
- 1.2、更新計劃
- 2、開始使用 Endor
- 3、目錄結構
- 4、類說明
- 4.1、WechatConfig
- 4.2、WechatValid
- 4.3、WechatCommon
- 4.4、WechatException
- 4.5、基礎接口
- 4.5.1、ShortUrl
- 4.5.2、WechatServerApi
- 4.6、菜單接口
- 4.6.1、菜單類設計
- 4.6.2、Menu
- 4.6.3、ClickMenu
- 4.6.4、ViewMenu
- 4.6.5、MiniProgramMenu
- 4.6.6、MenuApi
- 4.7、消息接口
- 4.7.1、Receiver
- 4.7.2、Message
- 4.7.3、EventMessage
- 4.7.4、TextMessage
- 4.7.5、ClickEventMessage
- 4.7.6、SubscribeEventMessage
- 4.7.7、UnSubscribeEventMessage
- 4.7.8、LocationEventMessage
- 4.7.9、ImageMessage
- 4.7.10、LinkMessage
- 4.7.11、NewsMessage
- 4.7.12、NewsContext
- 4.8、OAuth2.0權限驗證
- 4.8.1、WechatUser
- 4.8.2、OAuthApi
- 4.9、微信支付接口
- 4.9.1、微信支付類設計
- 4.9.2、PayApi
- 4.9.3、RequestPay
- 4.9.4、ResponsePay
- 4.9.5、UnifiedOrder
- 4.9.6、JsPay
- 4.9.7、Refund
- 4.9.8、Query
- 4.9.9、Bill
- 4.9.10、NotifyData
- 4.9.11、Notify
- 4.10、模板消息接口
- 4.10.1、TemplateContext
- 4.10.2、TemplateMessageApi
- 5、使用場景
- 5.1、微信接入服務器驗證
- 5.2、獲取微信API令牌(access_token)
- 5.3、獲取JS API
- 5.4、OAuth2.0靜默登錄
- 5.5、微信菜單
- 5.6、微信消息
- 5.7、微信支付
- 5.7.1、微信公眾號內JsApi支付
- 5.7.2、Native 模式二 掃碼支付
- 5.8、模板消息發送