PS:我是菜鸟,如果代码中有问题或有更好的实现方式,欢迎提出交流。
后面要显示页面的控制器中加入:
///支付
$trade_no=get_order_sn();
$this->trade_no=$trade_no;
//全局引入微信支付类
Vendor('WxPayPubHelper.WxPayPubHelper');
//使用jsapi接口
$jsApi = new \JsApi_pub();
if (!isset($_GET['code'])){
//触发微信返回code码
$url = $jsApi->createOauthUrlForCode(urlencode($this->fromurl));
//echo $url;die;
Header("Location: $url");
}else{
//获取code码,以获取openid
$code = $_GET['code'];
$jsApi->setCode($code);
$openid = $jsApi->getOpenId();
cookie('wx_openid',$openid);
}
if(empty($openid)){
//触发微信返回code码
$url = $jsApi->createOauthUrlForCode(urlencode($this->fromurl));
Header("Location: $url");
exit ();
}然后新建一个方法:public function wxPay(){
$price=I('price',0,'intval);
if($price){
$trade_no=get_order_sn();
$this->trade_no=$trade_no;
//全局引入微信支付类
Vendor('WxPayPubHelper.WxPayPubHelper');
//使用jsapi接口
$jsApi = new \JsApi_pub();
//使用统一支付接口
$unifiedOrder = new \UnifiedOrder_pub();
$openid=cookie('wx_openid');
$unifiedOrder->setParameter("openid",$openid);
$unifiedOrder->setParameter("body",'body');//商品描述
$out_trade_no = 'chi'.time();//商户订单号
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号
$unifiedOrder->setParameter("total_fee",$price*100);//总金额
$unifiedOrder->setParameter("notify_url","http://".$_SERVER['HTTP_HOST'].U('Wxpay/notify'));//通知地址
$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
$prepay_id = $unifiedOrder->getPrepayId();
//=========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
echo $jsApiParameters;
}else{
echo '输入的金额有问题';
}
}===========前端部分
===========
1、在前端代码中加入一个div,主要是用来保存post过来的订单数据
<div id="wx" data-appid="" data-time="" data-nonce="" data-pack="" data-sign="" style="display:none"></div>2、在JS中加入<script>
var price=$('#price').val();
var payurl="{:U('Index/wxPay')}";
$.post(payurl,{price:price},function(data){
$('#wx').attr('data-appid',data.appId);
$('#wx').attr('data-time',data.timeStamp);
$('#wx').attr('data-nonce',data.nonceStr);
$('#wx').attr('data-pack',data.package);
$('#wx').attr('data-sign',data.paySign);
callpay();
},'json');
</script>然后是支付部分的JS<script>
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
{
"appId":$('wx').attr('data-appid'),
"timeStamp":$('wx').attr('data-time'),
"nonceStr":$('wx').attr('data-nonce'),
"package":$('wx').attr('data-pack'),
"signType":"MD5",
"paySign":$('wx').attr('data-sign')
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
$('#pro-view-3').css('display','none');
//支付成功请求
//WeixinJSBridge.call('closeWindow');
var url="{:U('Cart/doAfterPayFor1')}";
var userUrl="{:U('User/duobaoRecord')}";
var yaoqing="{:U('Public/yaoqing')}";
var trade_no="{$trade_no}";
$.post(url,{trade_no:trade_no},function(data){
if(data.status==0){
layer.alert(data.info);
}else{
if(data.info==1){
window.location.href=yaoqing;
}else{
window.location.href=userUrl;
}
}
})
}
if(res.err_msg == "get_brand_wcpay_request:cancel" ) {
$('#wxpay').text('重新支付');
}
if(res.err_msg == "get_brand_wcpay_request:fail" ) {
layer.alert('支付失败!')
}
}
function callpay(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
}
</script> 最佳答案