**目录 (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、模板消息发送