微信公众号支付
微信公众号支付以TP3.2为例
首先,生成订单后跳到支付的页面,跳转地址代码为:
redirect(‘Payment/prepay’, array(‘order_num’ =>$data[‘order_num’]));
php代码
class PaymentController extends HomeController {
public function prepay() {
header("Content-type: text/html; charset=utf-8");
// 获取公众号配置信息,包括APPID、APPSECRET、商户号MACHID、API密钥
$siteConfig = C('WXCHAT');
define('APPID', $siteConfig['WECHAT_APPID']); // APPID
define('MACHID', $siteConfig['WECHAT_MACH']); // 商户号一般起名叫 MACHID
define('APPSECRET', $siteConfig['WECHAT_APPSECRET']); // APPSECRET
define('API', $siteConfig['WECHAT_API']); // API密钥
$order_id = I('order_num'); // 订单号
$this->assign('order_id',$order_id);
if(is_numeric($order_id) && $order_id !== ''){
// 订单信息
$orderInfo = M('Log')
->where(array('l_num'=>$order_id))
->find();
$this->assign('order_id',$order_id);
$this->assign('info',$orderInfo);
}
// 加载三方文件(微信支付sdk,放置于 ‘’ 项目名\ThinkPHP\Library\Vendor\WxpayAPI ‘’)
Vendor('WxpayAPI.WxPayJsApiPay');
Vendor('WxpayAPI.lib.WxPayApi');
Vendor('WxpayAPI.log');
ini_set('date.timezone','Asia/Shanghai');
//----------进行初始化日志操作--------------
// 获取用户openid
$tools = new \JsApiPay();
$openId = $tools->GetOpenid();
// 订单号
$out_trade_no = $order_id;
// 统一下单
$input = new \WxPayUnifiedOrder();
$input->SetBody($orderInfo['l_title']); //商品描述
$input->SetOut_trade_no($out_trade_no);
$input->SetTotal_fee($orderInfo['l_money'] * 100); // 金额 默认为分
$input->SetTime_start(date("YmdHis")); //支付发起时间
$input->SetTime_expire(date("YmdHis", time() + 600)); //支付超时
// 设置支付回调验证地址
$input->SetNotify_url('http://'.$_SERVER['HTTP_HOST'].'/Payment/notify');
$input->SetTrade_type("JSAPI"); // 支付类型
$input->SetOpenid($openId); // 用户OPENID
$order = \WxPayApi::unifiedOrder($input);
$jsApiParameters = $tools->GetJsApiParameters($order);
$this->assign('jsApiParameters',$jsApiParameters);
$this->display();
}
}
prepay.html代码
点击提交订单 触发 callpay();
js代码
function callpay()
{
var version = 5.0;
if (!checkWXVersion(version)) {
layer.open({content: '当前版本小于5.0,不支持微信支付。请升级微信版本!',skin: 'msg',time: 2});
} else {
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();
}
}
}
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
{$jsApiParameters},
function(res){
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == 'get_brand_wcpay_request:cancel') {
alert("您已取消了此次支付");
return;
} else if(res.err_msg == 'get_brand_wcpay_request:fail') {
alert("支付失败");
return;
} else if(res.err_msg == 'get_brand_wcpay_request:ok') {
var order_id = "{$order_id}";
var url = "__URL__/notify"; // 在回调地址里写支付成功或失败的逻辑
$.post(url,{'order_id':order_id},function(result){
if(result.success){
location.href="{:U('PortalUser/index')}";
}
},'json')
} else {
alert("未知错误"+res.error_msg);
return;
}
}
);
}
// 判断微信版本是否支持微信支付
function checkWXVersion(miniversion)
{
var pattern = /MicroMessenger[\s\/]+([\d.]+)/ig;
var ua = navigator.userAgent;
var match = pattern.exec(ua) || [];
var v = match[1] || 0;
return parseFloat(v) >= miniversion ? true : false;
}