小程序微信支付实例

前提要有https的支持。支付没那么复杂,原理想清楚后就基本可以实现了。这个实例是全部微信的敏感数据都走后台处理,微信js只负责调用接口。

代码写的可能有点乱,但是只在于原理不在于形式。

以下为js文件,接收订单信息进行Submit处理。

[javascript]  view plain  copy
  1. formSubmit: function (event) {  
  2.   var that=this;  
  3.    var form_data = event.detail.value;  
  4.  var radioValue=wx.getStorageSync('radioValue');  
  5.    form_data['radioValue']=radioValue;//是否需要合同  
  6.    //console.log(form_data);      
  7.   this.getLogin(that,form_data);//  
  8. }  
[javascript]  view plain  copy
  1. getLogin:function(that,form_data){//申请拿code  
  2.    wx.login({//这里不同于拿用户所有信息那个,好像小楼昨夜又秋风大神说的,那个和这个其实是区分开的  
  3.      success: function(res){  
  4.           if (res.code) {  
  5.                 //发起网络请求  
  6.     that.api_user_code(that,res,form_data);  
  7.               } else {  
  8.                 console.log('获取用户登录态失败!' + res.errMsg)  
  9.               }  
  10.      }  
  11.    })  
  12. }  
[javascript]  view plain  copy
  1. api_user_code: function (that,res,form_data) {//后台处理微信获取用户那个code的处理  
  2.   //console.log(res.code);  
  3.   wx.request({  
  4.     url: 'https://xxxxxxxxxxxxxx',//你的后台处理地址,我的是php后台处理  
  5.     data: {  
  6.       code: res.code  
  7.     },  
  8.     method: 'POST',  
  9.     header: { 'content-type''application/json' },  
  10.     success: function (res) {  
  11.       var openid= res.data.openid;  
  12.       //console.log(openid);  
  13.       that.orderChuli(that,openid,form_data);  
  14.       //that.paypay(openid);  
  15.     }  
  16.   })  
  17. }  
[php]  view plain  copy
  1. public function api_user_code(){//php后台的微信拿code处理,跟着微信做就好  
  2.     $user_code = file_get_contents('php://input''r');  
  3.        $user_code= json_decode($user_code,true);  
  4.        $code=$user_code['code'];  
  5.        $appid="xxxxxxxx";  
  6.        $secret="xxxxxxxxxxx";  
  7.         $url="https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";  
  8.    $curl = curl_init();//这个curl一开始总是不成功,关键点是你走去的url是https,这个要自行百度  
  9.        curl_setopt($curl, CURLOPT_URL, $url);  
  10.    //curl_setopt($curl, CURLOPT_HEADER,  array("Content-Type: application/json; charset=utf-8"));  
  11.    //$data =  array('name' =>"lijunsheng");  
  12.    //$data=json_encode($data);  
  13.    //$data_one=array('newlyIncrease'=>$newlyIncrease);  
  14.    //print_r($data_one);  
  15.    //curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);  
  16.    //curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
  17.    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
  18.    $res = curl_exec($curl);  
  19.    curl_close($curl);  
  20.    $res= json_decode($res,true);  
  21.    echo $res['data'];  
  22.         //echo $url;  
  23.        //$gotofind = array('code' => $code,'appid' => $appid,'secret' => $secret);  
  24.        //echo json_encode($gotofind);  
  25. }  
再回到小程序的js中

[javascript]  view plain  copy
  1. orderChuli:function(that,openid,form_data){//本人项目的一些购物车处理,没什么好看的,可以忽略,成功的话都是走去做支付功能的步骤  
  2.       //console.log(form_data);  
  3.   if(form_data.toCity ==0 ||form_data.toAddress ==0||form_data.toName ==0||form_data.toMobile ==0){  
  4.     wx.showModal({  
  5.        title: '提示',  
  6.     content: '你的收货地址并没完整,系统将带你去到添加收货地址页面',  
  7.     success: function (res) {  
  8.        if (res.confirm) {  
  9.             wx.navigateTo({  
  10.     url: "../address/address"  
  11.   })  
  12.        }  
  13.     }  
  14.     })  
  15.   }else{  
  16.   var num = Math.random() * 10000 + 100;  
  17.   num = parseInt(num, 10);  
  18.   form_data.orderId = num;  
  19.   form_data.providerCode = openid;  
  20.   form_data.senderCode = "www.EF.com";  
  21.   //console.log(form_data.total_money);  
  22.   var total_money=form_data.total_money;  
  23.   wx.showModal({  
  24.     title: '提示',  
  25.     content: '确定提交订单?',  
  26.     success: function (res) {  
  27.       if (res.confirm) {  
  28.         var qingling_arr = wx.getStorageSync('qingling_arr');  
  29.         //console.log(qingling_arr);  
  30.         wx.request({  
  31.           url: 'https://xxxxxxxxxxxxxxxx',  
  32.           data: {  
  33.             goods_arr: qingling_arr,  
  34.             goods_address: form_data  
  35.           },  
  36.           method: 'POST'// OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT  
  37.           header: { 'content-type''json' },  
  38.           success: function (res) {  
  39.             if(total_money == 0){//有会员码的情况下,直接后台录入数据  
  40.   wx.clearStorage();  
  41.               wx.showToast({  
  42.                 title: '成功',  
  43.                 icon: 'success',  
  44.                 duration: 1000  
  45.               });  
  46.               setTimeout(function () {  
  47.                 wx.switchTab({  
  48.                   url: "../index/index"  
  49.                 })  
  50.               }, 2000);  
  51.             }else{  
  52. var orderId = res.data;  
  53. that.paypay(that,openid,total_money,orderId);//关键来啦,把openid和钱和订单走去支付啦!  
  54.             }  
  55.         //console.log(id);  
  56.             //console.log(total_money);  
  57.             //console.log(res);  
  58.             /*  
  59.             if (res.data != "not") {  
  60.                 wx.clearStorage();  
  61.               wx.showToast({  
  62.                 title: '成功',  
  63.                 icon: 'success',  
  64.                 duration: 1000  
  65.               });  
  66.               setTimeout(function () {  
  67.                 wx.switchTab({  
  68.                   url: "../index/index"  
  69.                 })  
  70.               }, 2000);  
  71.             }else{  
  72.                 wx.showToast({  
  73.                 title: '请填写正确会员码',  
  74.                 icon: 'loading',  
  75.                 duration: 1000  
  76.               });  
  77.             }  
  78.   
  79.           }  
  80.         })  
  81.       }  
  82.     }  
  83.   })  
  84.   }  
  85. }  
关键点来啦!切记切记,可以拿回以前微信的支付demo来套入,就是统一支付接口那!不行就试多几次,肯定可以的!都是后台来处理的
[javascript]  view plain  copy
  1. paypay:function(that,openid,total_money,orderId){  
  2.    wx.request({  
  3.      url: 'https://xxxxxxxxx',//后台语言的处理  
  4.      data: {  
  5.         openid:openid,  
  6.         total_money:total_money  
  7.      },  
  8.      method: 'POST'// OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT  
  9.     header: { 'content-type''application/json' },  
  10.      success: function(res){  
  11.         console.log(res);  
  12.         var nonceStr=res.data.nonce_str;  
  13.         var appId=res.data.appid;  
  14.         var pkg = 'prepay_id='+ res.data.prepay_id;  
  15.         var timeStamp =res.data.timeStamp;  
  16.         var paySign = res.data.paySign;  
  17.         var sign = res.data.sign;  
  18.          //console.log(pkg);  
  19.         wx.requestPayment({  
  20.           timeStamp: timeStamp,  
  21.           nonceStr: nonceStr,  
  22.           package: pkg,  
  23.           signType: 'MD5',  
  24.           paySign: paySign,  
  25.           success: function(res){  
  26.             that.changeOrderIdPay(orderId);  
  27.           }  
  28.         })  
  29.      }  
  30.    });  
  31. }  
php后台
[php]  view plain  copy
  1.     public function ef_wx_pay(){  
  2.      include_once("efwxpay/WxPayPubHelper/WxPayPubHelper.php");//微信demo的文件,帮你处理所有的数据  
  3.         $openid = file_get_contents('php://input''r');  
  4.         $openid= json_decode($openid,true);  
  5.          $total_money = file_get_contents('php://input''r');  
  6.         $total_money= json_decode($total_money,true);  
  7.         $openid=$openid['openid'];  
  8.         $total_money=$total_money['total_money'];  
  9.       
  10. //使用统一支付接口  
  11.         
  12.     $unifiedOrder = new UnifiedOrder_pub();  
  13.     //echo $res;  
  14.     //设置统一支付接口参数  
  15.     //设置必填参数  
  16.     //appid已填,商户无需重复填写  
  17.     //mch_id已填,商户无需重复填写  
  18.     //noncestr已填,商户无需重复填写  
  19.     //spbill_create_ip已填,商户无需重复填写  
  20.     //sign已填,商户无需重复填写  
  21.     $unifiedOrder->setParameter("body","EF礼品订购");//商品描述  
  22.     //自定义订单号,此处仅作举例  
  23.     $timeStamp = time();  
  24.     $out_trade_no = WxPayConf_pub::APPID."$timeStamp";  
  25.     $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号   
  26.     $unifiedOrder->setParameter("total_fee","$total_money"."00");//总金额  
  27.     //$unifiedOrder->setParameter("total_fee","$res"."00");//总金额  
  28.     $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址   
  29.     $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型  
  30.     //非必填参数,商户可根据实际情况选填  
  31.     $unifiedOrder->setParameter("openid","$openid");//用户标识  
  32.     //获取统一支付接口结果  
  33.     $unifiedOrderResult = $unifiedOrder->getResult();  
  34.         //商户根据实际情况设置相应的处理流程  
  35.     if ($unifiedOrderResult["return_code"] == "FAIL")   
  36.     {  
  37.         //商户自行增加处理流程  
  38.         echo "通信出错:".$unifiedOrderResult['return_msg']."<br>";  
  39.     }  
  40.     elseif($unifiedOrderResult["result_code"] == "FAIL")  
  41.     {  
  42.         //商户自行增加处理流程  
  43.         echo "错误代码:".$unifiedOrderResult['err_code']."<br>";  
  44.         echo "错误代码描述:".$unifiedOrderResult['err_code_des']."<br>";  
  45.     }else{  
  46.         //echo json_encode($unifiedOrderResult);  
  47.         //$paySign=$this->againQ($unifiedOrderResult);  
  48.         //$unifiedOrderResult['paySign']=$paySign;  
  49.         $nonce_str=$unifiedOrderResult['nonce_str'];  
  50.         $mch_id=$unifiedOrderResult['mch_id'];  
  51.         $appid=$unifiedOrderResult['appid'];  
  52.         $prepay_id=$unifiedOrderResult['prepay_id'];  
  53.         $key="xkF5KMzLR8vjZmJDBV34uqPcdXHbUhAs";  
  54.         $stringA="appId=$appid&nonceStr=$nonce_str&package=".'prepay_id='."$prepay_id&signType=MD5&timeStamp=$timeStamp";//这里记得顺序和大小写!切记!  
  55.         $stringSignTemp="$stringA&key=$key";  
  56.         $paySign=MD5($stringSignTemp);  
  57.         $paySign=strtoupper($paySign);  
  58.         $unifiedOrderResult['paySign']=$paySign;  
  59.         $unifiedOrderResult['timeStamp']="$timeStamp";  
  60.         echo json_encode($unifiedOrderResult);  
  61.     }  
  62.     }  
小程序js最后收尾,没什么好写的,就处理下完成订单后的动作

[javascript]  view plain  copy
  1. changeOrderIdPay:function(orderId){  
  2.   var url="https://xxxxxx";  
  3.     wx.request({  
  4.       url: url,  
  5.       data: {  
  6.         orderId:orderId  
  7.       },  
  8.       method: 'POST'// OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT  
  9.       header: { 'content-type''application/json' },  
  10.       success: function(res){  
  11.       wx.clearStorage();  
  12.       }  
  13.     })  
  14. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值