微信支付:输入金额并直接同一页面中付款的实现

浏览:5211 发布日期:2016/08/26 分类:技术分享 关键字: 微信支付
今天在用TP3.2写一个一元购的程序时,遇到这个支付问题,花了一百元向高手求教后,自己整理了一下,分享出来,需要的朋友自己看看哦。

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>
最佳答案
评论( 相关
后面还有条评论,点击查看>>