微信小程序支付_微信小程序 微信支付 支付类型 - CSDN
精华内容
参与话题
  • 学习微信小程序已经半个多月了,终于接触到小程序中一个很重要的功能——微信支付。接下来就给大家详细讲解一下微信支付功能的调用。一想到微信支付,大家一定会去看微信小程序的API文档,没错,作为一个菜鸟我也看...

    学习微信小程序已经半个多月了,终于接触到小程序中一个很重要的功能——微信支付。接下来就给大家详细讲解一下微信支付功能的调用。

    一想到微信支付,大家一定会去看微信小程序的API文档,没错,作为一个菜鸟我也看过,当然我第一次看的时候脑袋也有点晕,因为其中所需要的参数有点多,而且很多东西我们都不知道怎样去获得。没关系,下面我一步一步给各位讲解,怎么去实现微信支付这一功能的调用。

    首先大家需要去下载一个公众号支付的sdk,下面是网址
    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
    我的服务器后台选用的是php,所以我下载的是php的sdk。

    话不多说,接下来开始我们的正题。我们下载完sdk以后会发现这就是一个支付的demo,微信团队已经把所有的代码帮我们写好了,但是请注意,这是公众号支付的demo,因此我们需要修改一下其中的部分内容。

    1.首先我们打开WxpayAPI_php_v3.0.1目录下的cert目录,我们可以看到cert目录放的就是我们的证书文件,我们需要把原有的证书文件删除,替换成我们微信商户平台中的证书文件。所谓证书文件,就是当你注册成功一个微信商户号后,在“账户中心—API安全”下我们可以下载我们的证书,微信团队需要在支付时确认商家身份,所以需要这一环节,如下图
    原始文件

    替换后的文件

    2.配置完证书以后,我们就该配置我们的小程序信息和商家信息了。在文件夹lib目录下的WxPay.Config.php文件中,我们可以看到一些参数的信息,因此我们需要把它修改成我们自己的信息。如下图。
    这里写图片描述

    3.修改example目录下的WxPay.JsApiPay.php文件。如下图。
    原始代码

    途中参数code指的是获取到的用户的code,但是在开发文档中code变量为js_code,因此我们需要将202行中的code->js_code。还有第205行,我们需要的接口应该为wx.login中的接口,因为我们需要把这些参数传上去,因此修改后的代码为下图。
    修改后的代码

    3.在example目录下的jsapi.php文件中,我们可以修改以下信息。
    这里写图片描述

    其中的参数信息我们可以在微信文档中了解,部分的参数我们无需修改,大家想了解参数可以进入下面链接。
    https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1
    最后29行是我手动加上去的,给我们的前台返回统一下单的这些参数,以便我们传递给微信支付API。然后我们还需要把这个文件中的H5代码注释掉或者删掉,因为小程序不会显示这些代码。注释掉下图中的全部H5代码
    这里写图片描述

    当我们做完以上几步以后,我们就可以开始我们的微信小程序的开发了。首先我们创建一个项目,添加我们的APPID。

    首先在app.js中我们需要调用wx.login方法来获取用户的code

    //app.js
    App({
      code: null,
      onLaunch: function () {
        var that=this;
        wx.login({
          success: function (res) {
            if (res.code) {
              that.code=res.code;
            } else {
              console.log('获取用户登录态失败!' + res.errMsg)
            }
          }
        });
      },
    
    })

    然后我们创建一个page,命名为pay,我们在pay.wxml中创建一个按钮,并且给它绑定事件,我们希望点击按钮实现支付功能。

    <view>
    <button bindtap='wxpay' class='css'>发起支付</button>
    </view>

    接下来是pay.js代码

    // pages/pay/pay.js
    var app=getApp();
    Page({
      wxpay: function(){
        var code=app.code;
        wx.request({
          //我把文件夹名改为了wxpayapi,SERVER_PATH为服务器的域名
          url: SERVER_PATH+'wxpayapi/example/jsapi.php', 
          data: {
            code: code
          },
          header: {
            'content-type': 'application/json' // 默认值
          },
          success: function (res) {
            console.log(res.data);
            var data=res.data;
            wx.requestPayment({
              'timeStamp': data.timeStamp,
              'nonceStr': data.nonceStr,
              'package': data.package,
              'signType': 'MD5',
              'paySign': data.paySign,
              'success': function (res) {
                console.log("支付成功!")
              },
              'fail': function (res) {
              }
            })
          }
        })
      }
    })

    这里写图片描述
    当我们获取到code后就把code发送给jsapi.php文件,然后我们把结果给log出来,我们可以看到我们统一下单api给我们返回的参数,而这些参数正是wx.requestPayment所需要的参数,因此我们直接传给wx.requestPayment方法,然后就可以支付了。
    这里写图片描述

    接下来还有一个很重要的环节,就是我在调用微信支付功能的工程中所遇到的一些bug,可能有些人也会遇到同样的问题,于是我就给大家说明一下。

    1.发送请求失败。我们调用wx.request给服务器发送请求的时候必须在微信小程序的后台给我们的服务器域名设置白名单。在“设置->开发设置”。
    这里写图片描述
    需要注意的一点是我们发起请求的是域名,而且是HTTPS的域名,因此如果请求的地址是IP或者是HTTP,编译器会报错。

    2.

    Notice: “Undefined property: JsApiPay::$curl_timeout in C:\xampp\htdocs\www\curtain\public\WxPay414\WxPay.JsApiPay.php on line 100”

    这里写图片描述
    这里写图片描述
    在此处改为30,指30s。

    3.证书问题。

    Fatal error: Uncaught WxPayException: curl出错,错误码:60 in C:\xampp\htdocs\www\curtain\public\WxPay414\lib\WxPay.Api.php:564
    Stack trace:
    解决方法:http://blog.csdn.net/qq_34755805/article/details/51221932

    4.<b>Notice</b>: Undefined index: access_token in <b>C:\phpStudy\PHPTutorial\WWW\wxpayapi\example\WxPay.JsApiPay.php</b> on line <b>156</b><br />

    解决方法,注释掉第156行。
    这里写图片描述


    展开全文
  • 博主,之前做微信支付,在网上很少找到支付...2.微信小程序处理 .wxml .js 3 后台处理部分(博主使用php为例子)【其他语言参照修改就可以了】 以下参数不懂,可通过这个查看,微信文档查看参数的名称 https:/...

    博主,之前做微信支付,在网上很少找到支付的文章,所以就抽空把微信支付流程给整理出来,方便各位刚刚接触微信支付的用户,参考,如有不好之处,欢迎评论指出

    1、必须开通支付,并且有备案的域名 和 配置 https

    2.微信小程序处理

    .wxml

    .js

    3 后台处理部分(博主使用php为例子)【其他语言参照修改就可以了】

    以下参数不懂,可通过这个查看,微信文档查看参数的名称

    https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1

    下面是实现的代码:


    //微信支付
    public function Pay(){
        $fee = 0.01;//举例充值0.01
        $appid =        '微信小程序的appid【自己填写】';//如果是公众号 就是公众号的appid
        $body =         '蜗牛充值【自己填写】';
        $mch_id =       '你的商户号【自己填写】';
        $nonce_str =    $this->nonce_str();//随机字符串
        $notify_url =   '回调的url【自己填写】';
        $openid =       '用户的openid【自己填写】';
        $out_trade_no = $this->order_number();//商户订单号
        $spbill_create_ip = '服务器的ip【自己填写】';
        $total_fee =    $fee*100;//因为充值金额最小是1 而且单位为分 如果是充值1元所以这里需要*100
        $trade_type = 'JSAPI';//交易类型 默认

        //这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错
        $post['appid'] = $appid;
        $post['body'] = $body;
        $post['mch_id'] = $mch_id;
        $post['nonce_str'] = $nonce_str;//随机字符串
        $post['notify_url'] = $notify_url;
        $post['openid'] = $openid;
        $post['out_trade_no'] = $out_trade_no;
        $post['spbill_create_ip'] = $spbill_create_ip;//终端的ip
        $post['total_fee'] = $total_fee;//总金额 最低为一块钱 必须是整数
        $post['trade_type'] = $trade_type;
        $sign = $this->sign($post);//签名
        $post_xml = '<xml>
               <appid>'.$appid.'</appid>
               <body>'.$body.'</body>
               <mch_id>'.$mch_id.'</mch_id>
               <nonce_str>'.$nonce_str.'</nonce_str>
               <notify_url>'.$notify_url.'</notify_url>
               <openid>'.$openid.'</openid>
               <out_trade_no>'.$out_trade_no.'</out_trade_no>
               <spbill_create_ip>'.$spbill_create_ip.'</spbill_create_ip>
               <total_fee>'.$total_fee.'</total_fee>
               <trade_type>'.$trade_type.'</trade_type>
               <sign>'.$sign.'</sign>
            </xml> ';
        //统一接口prepay_id
        $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
        $xml = $this->http_request($url,$post_xml);
        $array = $this->xml($xml);//全要大写
        if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){
            $time = time();
            $tmp='';//临时数组用于签名
            $tmp['appId'] = $appid;
            $tmp['nonceStr'] = $nonce_str;
            $tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
            $tmp['signType'] = 'MD5';
            $tmp['timeStamp'] = "$time";

            $data['state'] = 1;
            $data['timeStamp'] = "$time";//时间戳
            $data['nonceStr'] = $nonce_str;//随机字符串
            $data['signType'] = 'MD5';//签名算法,暂支持 MD5
            $data['package'] = 'prepay_id='.$array['PREPAY_ID'];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
            $data['paySign'] = $this->sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;
            $data['out_trade_no'] = $out_trade_no;

        }else{
            $data['state'] = 0;
            $data['text'] = "错误";
            $data['RETURN_CODE'] = $array['RETURN_CODE'];
            $data['RETURN_MSG'] = $array['RETURN_MSG'];
        }
        echo json_encode($data);
    }


    //随机32位字符串
    private function nonce_str(){
        $result = '';
        $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
        for ($i=0;$i<32;$i++){
            $result .= $str[rand(0,48)];
        }
        return $result;
    }


    //生成订单号
    private function order_number($openid){
        //date('Ymd',time()).time().rand(10,99);//18位
        return md5($openid.time().rand(10,99));//32位
    }


    //签名 $data要先排好顺序
    private function sign($data){
        $stringA = '';
        foreach ($data as $key=>$value){
            if(!$value) continue;
            if($stringA) $stringA .= '&'.$key."=".$value;
            else $stringA = $key."=".$value;
        }
        $wx_key = '';//申请支付后有给予一个商户账号和密码,登陆后自己设置key
    $stringSignTemp = $stringA.'&key='.$wx_key;//申请支付后有给予一个商户账号和密码,登陆后自己设置key return strtoupper(md5($stringSignTemp));}

    //curl请求啊
    function http_request($url,$data = null,$headers=array())
    {
        $curl = curl_init();
        if( count($headers) >= 1 ){
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }
        curl_setopt($curl, CURLOPT_URL, $url);

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }

    //获取xml
    private function xml($xml){
        $p = xml_parser_create();
        xml_parse_into_struct($p, $xml, $vals, $index);
        xml_parser_free($p);
        $data = "";
        foreach ($index as $key=>$value) {
            if($key == 'xml' || $key == 'XML') continue;
            $tag = $vals[$value[0]]['tag'];
            $value = $vals[$value[0]]['value'];
            $data[$tag] = $value;
        }
        return $data;
    }


    这里就实现微信支付了,看效果,在真机上面测试,才行

    --------------------- 
    作者:CSDN蜗牛 
    来源:CSDN 
    原文:https://blog.csdn.net/xieshunhai/article/details/72829232?utm_source=copy 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 详解微信小程序支付流程

    万次阅读 多人点赞 2018-07-02 18:29:54
    花了几天把小程序的支付模块接口写了一下...微信小程序的商户系统一般是以接口的形式开发的,小程序通过调用与后端约定好的接口进行参数的传递以及数据的接收。在小程序支付这块,还需要跟微信服务器进行交互。过程...

      花了几天把小程序的支付模块接口写了一下,可能有着公众号开发的一点经验,没有入太多的坑,在此我想记录一下整个流程。

    首先先把小程序微信支付的图搬过来:


    相信会来查百度的同学们基本都是对文档的说明不是很理解。我下面大概总结一下整个业务逻辑的过程。

    微信小程序的商户系统一般是以接口的形式开发的,小程序通过调用与后端约定好的接口进行参数的传递以及数据的接收。在小程序支付这块,还需要跟微信服务器进行交互。过程大致是这样的:

    一.小程序调用登录接口获取code,传递给商户服务器用来获取用户的openID

     我们知道在微信平台中,同一个公众号的openID都是不同的,它是用户身份识别的id,也就是说,我们通过openID来区分不同的用户,这个有微信开发基础的应该都很熟悉。为了知道谁在支付,我们需要先获取当前用户的openid,那么openID应该怎么获取呢?看下图:


    1. 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

    2. 开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key

    看不懂吗?不急,听我慢慢解释,这个业务流程大致就是首先你得先在小程序的代码中调用wx.login()来向微信获取到code,拿到了之后把code通过request传给商户服务器,再由商户服务器通过骚操作来跟微信服务器要session_key和openID。

    伪代码如下(小程序端):

    getToken: function () {
        //调用登录接口
        wx.login({
          success: function (res) {
            var code = res.code;
            wx.request({
              url: 商户服务器接口地址, 
              data: {
                code: code
              },
              method: 'POST', 
              success: function (res) { 
                wx.setStorageSync('token', res.data.token); //存在小程序缓存中
              },
              fail: function (res) {
                console.log(res.data);
              }
            })
          }
        })
      }

    调用这几行代码就可以向跟微信服务器要code,并且将code传到商户服务器中,记住这里最好使用post发送请求,安全性的东西我应该不用讲了,因为避免其他人滥用接口,于是我们使用token来进行验证。并将商户服务器返回的token存在小程序缓存中。

    那么服务器端应该怎么做呢?

    我门通过小程序提交的code,和小程序的APPID以及APPSECRET和拼接下列的url,并用curl进行get请求。

    https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    返回的数据是一个json对象,我门通过使用json_decode(JSON,true)解析为数组,数据包括用户的openID以及session_key,获取到了后我们应该将openID存入数据库中,它代表着用户的身份,那么令牌应该怎么生成呢。

    二.token的生成以及缓存

    我们根据一个用户表将id和openid联系起来,对应openID的id则是用户的uid,我们可以这么封装

    //要缓存的数据数组
    $cacheValue = $result;   //包含openID和session_key
    $cacheValue['uid'] =$uid;   //用户id
    
    $cacheValue['scope'] =ScopeEnum::User;   //用户权限级别

    缓存的方式我们可以选择redis,memcache, 文件缓存等等,采用键值对(key-value)的方式进行存储,记得设置好过期时间。这里的key我们用token来赋值,token可以通过这样的方式进行生成:

    //获取32位随机字符串
    $str = getRandChar(32);   //自定义方法生成32位随机串
    //三组字符串进行md5加密
    $timeStamp =$_SERVER['REQUEST_TIME_FLOAT'];
    //salt
    $salt = config('secure.token_salt'); //随机字符串
    //返回token
    
    return md5($str.$timeStamp.$salt);

    这种算法基本保障了token的唯一性。因为值是我们获取到的openID和session_key所在的数组,所以需要将数组转成json才能存进去。以后的代码当我们需要openID或者uid等时可以直接通过取缓存的方式来取。

    三,调用统一下单接口,获取prepay_id,再次签名

     在你写完了订单操作后,如何让用户支付订单费用呢?这里就是重点了,我一步一步来说:

    1.下载微信JS-SDK:

    (https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)

    解压打开进入lib文件夹中:


    我们需要将lib中的文件放到我们的框架中,例如我使用的是tp5,就放到extend下,最好是在extend下建个子文件夹。其中WxPay.Api.php是入口,WxPay.Config.php是配置文件。下好后需要改动一些地方。在WxPay.Config.php中修改下列的东西改成你的。


    然后在WxPay.Api.php中require一下WxPay.Notify.php,如图:

    在某个控制器或者服务层的代码先是用Loader::import()引入WxPay.Api.php,相当于五个都引入了。

    2.调用统一下单api

    这里要啰嗦的是,如何你写的是有关商品买卖的小程序,那么需要在支付前再次检测一下库存量,因为用户下完订单后不一定马上就会付款,如果在付款的期间库存量没了便会出现问题。业务逻辑我就不说太多了,这取决于你写代码的严谨性。

    在我们引入了上面那个文件后,先实例化这个类WxPayUnifiedOrder,把需要的参数通过调用对应的方法传入。

    伪代码如下:

     //调用微信支付统一下单接口
            $wxOrderData = new \WxPayUnifiedOrder();
            //设置相关参数
            $wxOrderData->SetOut_trade_no($this->orderNO);
            $wxOrderData->SetTrade_type('JSAPI');
            $wxOrderData->SetTotal_fee($totalPrice * 100); //这里的价格单位是分
            $wxOrderData->SetBody('Mc');
            $wxOrderData->SetOpenid($openid);
            $wxOrderData->SetNotify_url(config('secure.pay_back_url'));//支付回调

    其中第一个是你的订单号,订单号的生成方法可以自定义,第二个是死参数,第三个是总订单价格,第四个是名称如果是中文的话要转码,第四个是openID,这个这时候就可以从缓存中取了。最后一个是支付回调,就是支付成功后微信要访问的地址。必须是公网能访问的,或者你使用ngrok来进行反向代理转发本地的服务器。

    参数设置好了之后,就直接调用SDK的方法了

     $wxOrder = \WxPayApi::unifiedOrder($wxOrderData);
    如果参数没有错误的话,返回的数据中会含有prepay_id,这个是我们需要的参数。


    3.再次签名
    //  提交JSAPI输入对象
            $jsApiPayData = new \WxPayJsApiPay();
            //设置appid
            $jsApiPayData->SetAppid(config('wx.app_id'));
            //timeStamp
            $jsApiPayData->SetTimeStamp((string)time());
            //随机串
            $randStr = md5(time().mt_rand(0,1000));
            $jsApiPayData->SetNonceStr($randStr);
            //数据报
            $jsApiPayData->SetPackage('prepay_id='.$wxOrder['prepay_id']);
            //类型
            $jsApiPayData->SetSignType('MD5');
            //生成签名
            $sign  = $jsApiPayData->MakeSign();
            //获得签名数组
            $signData = $jsApiPayData->GetValues();
            //增加字段paySign
            $signData['paySign']=$sign;
            //删除signData中的app_Id字段
            unset($signData['appId']);
            return $signData;

    再次签名完成后,就把五个参数返回给小程序。

    四,小程序获取五个参数后,鉴权调起支付

    伪代码(小程序端)

      pay: function () {
        var token = wx.getStorageSync('token');
        var that = this;
      
        wx.request({
          url: baseUrl + '/order',
          header: {
            token: token
          },
          data: {   //产品的数据
            products:
            [
              {
                product_id: 1, count: 1
              },
              
              {
                product_id: 2, count: 1
              }
            ]
          },
          method: 'POST',
          success: function (res) {
            console.log(res.data);
            if (res.data.pass) {
              wx.setStorageSync('order_id', res.data.order_id);
              that.getPreOrder(token, res.data.order_id); //调用getPreOrder
            }
            else {
              console.log('订单未创建成功');
            }
          }
        })
      },
    
      getPreOrder: function (token, orderID) {
        if (token) {
          wx.request({
            url: baseUrl + '/pay/pre_order',
            method: 'POST',
            header: {
              token: token
            },
            data: {
              id: orderID
            },
            success: function (res) {
              var preData = res.data;
              console.log(preData);
              
              wx.requestPayment({    //请求支付
                timeStamp: preData.timeStamp.toString(),
                nonceStr: preData.nonceStr,
                package: preData.package,
                signType: preData.signType,
                paySign: preData.paySign,
                success: function (res) {
                  console.log(res.data);     
                },
                fail: function (error) {
                  console.log(error);
                }
              })
            }
          })
        }
      },

    如果一切正常的话,在微信开发者工具就会显示这个二维码,


    如果在真机上测试的话,就会直接弹出支付页面。小程序会直接显示支付成功或者失败的页面,然后微信服务器就会开始访问我们之前设置的支付回调地址来推送支付结果,根据结果可以来更新订单的状态。这里我就不写业务逻辑了,大概讲一下就好。

    五,支付回调

    实际上我们需要重写WxPayNotify类的NotifyProcess方法,这里记得Loader::impor()引入那个入口类。

    /**
    	 * 
    	 * 回调方法入口,子类可重写该方法
    	 * 注意:
    	 * 1、微信回调超时时间为2s,建议用户使用异步处理流程,确认成功之后立刻回复微信服务器
    	 * 2、微信服务器在调用失败或者接到回包为非确认包的时候,会发起重试,需确保你的回调是可以重入
    	 * @param array $data 回调解释出的参数
    	 * @param string $msg 如果回调处理失败,可以将错误信息输出到该方法
    	 * @return true 回调出来完成不需要继续回调,false回调处理未完成需要继续回调
    	 */
    	public function NotifyProcess($data, &$msg)
    	{
    		//TODO 用户基础该类之后需要重写该方法,成功的时候返回true,失败返回false
    		return true;
    	}

      也就是说你需要写个新类继承WxPayNotify,再重写NotifyProcess方法,根据检查$data['result_code']是否为SUCCESS可以判断成功与否,成功的话你可以根据业务需求写业务逻辑,最后return true 即可。这时候会想,我重写了这个方法后微信怎么调用呢,其实这里微信不是要直接调用这个方法,你应该在微信支付回调的方法中实例化这个新类,然后根据获得的对象去调用Handle()方法。$obj = new 新类(),$obj->Handle()。


    展开全文
  • 小程序微信支付 实例配置详解

    万次阅读 热门讨论 2019-07-05 12:24:01
    近期进行小程序的开发,毕竟是商城项目的开发,最后牵扯到的微信支付是必要的个人开发过程中也是遇到各种问题。在此,进行代码的详细配置,以方便小程序新手的快速操作 使用语言:PHP 框架:ThinkPHP 3.2 整理时间...

    ★ 背景

    • 近期进行小程序的开发,毕竟是商城项目的开发,最后牵扯到的微信支付是必要的
    • 个人开发过程中也是遇到各种问题,在此,我根据自己的实际操作,进行了代码的详细配置,以方便小程序新手的快速操作
    -  使用语言:PHP             # PHP世界上最好的语言 HaHahahaaha
    -  使用框架:ThinkPHP 3.2    # 版本有点低而已,没啥大碍
    -  测试工具:微信开发者工具    # 其实还挺好用
    -  整理时间:2018-07-07      # 有问题,就会一直更新
    

    tip: 【代码都是可转化的,即便是 ThinkPHP5.0+ 还是 Laravel框架,相对熟悉 PHP 代码语法的,进行转化也只是分分钟的事哦!】

    一、开发前的准备

    ①. 开发步骤

    • 如果开发者已做过 JSAPIJSSDK 调起微信支付,接入小程序支付非常相似,以下是三种接入方式的对比:

    如此看来,小程序要想集成支付功能,倒是简单了

    ②. 阅读业务流程图

    • 本人强烈推荐阅读这个图示,流程明确了,代码逻辑自然也就理顺了!

    ③. 小程序支付业务

    • 此处,小程序官方已做了详细说明 —— 业务说明
    # 很多人这一步还没有完成,就咔咔咔的测试支付功能,显然是太急于求成了,比如:我!
    > 注意:
    > 1. 要开通微信支付功能(一般有两三天的审核时间)
    > 2. 本人开通后,选择的是 “绑定一个已有的微信支付商户号”,也就几分钟的事
    

    • 此处请阅读官方文末的注意事项【重要】:
    1 appid 必须为最后拉起收银台的小程序appid; 
    		# 这句话感觉不说还好,一说更容易引起多余的考虑(忽视)
    
    2 mch_id 为和 appid 成对绑定的支付商户号,收款资金会进入该商户号;
    		# 此处我直接使用了所绑定的商户号中的 mch_id
    
    3 trade_type 请填写"JSAPI"; 
    		# 可暂时忽略,因为我在代码中已进行了配置
    
    4 openid 为 appid 对应的用户标识,即使用 "wx.login" 接口获得的 openid 
    		# 可参考我的 payment/index.js 代码
    		# 另一种情况,如果项目数据库中已保存了该用户的openid字段,可自行获取
    

    二、小程序端代码配置指导

    • 这里进行配置的代码,都在附录源码包的 wxMini-PayDemo\wxChat 目录下

    为了项目代码的 通用性/易管理性,我自行提取出了两个主要的公共文件 config.jsutil.js;

    ①. utils下 config.js 文件的使用

    • config.js 文件中,主要就是配置一些公共访问路径之类的数据,方便后期代码上线后的链接更改
    • 所以,对于其中的 restUrlimgServer 修改为自己的服务器地址即可
    > 注意一点:
    我的 "restUrl" 是对应于我的小程序 Api 接口路径的,举个例子:
    我的支付回调路径为 "https://www.mySercver.com/WxApi/Pay/notify" 
    

    ②. utils下 util.js 文件的使用

    • 这个是和 config.js 文件在同一目录下的公共文件
    • 其实就是整合了三个主要的方法,需要注意的是:如果你有所补充,记得在文件的最后进行 “exports” 输出就好
    module.exports = {
      http_get: http_get,
      http_post: http_post,
      showToast: showToast,
    }
    

    ③. payment/index.js 文件的使用

    • 此文件作为 小程序微信支付前端的核心文件
    • 在保证你的各个文件目录对应配置正确的情况下,只需在进行支付唤醒时,调用其中的 btnClickToPay() 方法即可:
    • 当然,我只是随便定的一个方法,实际使用的时候,其实就是以类似的形式,去调用后面的 wxPay()方法呗!

    三、服务端代码文件的使用指导

    • 这里进行配置的代码,都在源码包的 wxMini-PayDemo\Server-PHP 目录下

    声明:
    因为本人所提供的代码是基于 ThinkPHP3.2 框架编写整理的,所以对于使用过 ThinkPHPLaravel 框架的 PHPer 来说,简单明了,可根据自己的框架进行调整适配,所以,此处讲的可能不会太过琐碎

    ①. 公共配置文件的数据补充

    • 此为源代码中的 "wxMini-PayDemo\Server-PHP\Conf\config.php",此文件代码比较少,我直接进行展示:
    return array(
        //'配置项'=>'配置值'
        'wxPay' => [
            'appid' => 'wx8787xxxxxxxxxxxxx',//TODO 此处使用的是小程序的 APPID
            'app_secret' => '0a7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx622', //小程序的应用密钥
            'pay_mchid' => '13xxxxxx02', // 微信支付MCHID 商户收款账号
            'pay_apikey' => '1qaxxxxxxxxxxxxxxxxxxxxxhgf5', // 微信支付KEY
            'notify_url' => 'https://www.mySercver.com/WxApi/Pay/notify', // 微信支付成功后进行回调的链接
            'login_url' => "https://api.weixin.qq.com/sns/jscode2session?" .
                "appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", // 微信使用code换取用户openid及session_key的url地址
        ],
    );
    
    • 对于上述配置信息的来源,应该没啥疑问吧?
    注意一点:
    "notify_url" 作为支付回调的链接地址,要求配置成自己的服务器路径 
    	;#同时注意协议的要求 “https” 
    
    小程序官方要求:
    	;# 需要进行服务器域名的配置
    	;# 操作位置为 “小程序(微信公众平台)/设置/开发设置”中的“服务器域名->request 合法域名”
    

    ②. 公共方法 function.php 的补充

    • 对于本人的逻辑处理中,其实只有一个方法 curl_get(), 并且只在 PayController.class.phpgetOpenID() 方法中进行了一次调用,也可以自行提取使用的

    ③. 核心处理文件 PayController.class.php

    此文件代码已做了详细处理,在你正确放置后,需要注意的几点如下:

    • (1). 注意命名空间 "namespace" 与自己业务代码的对应
    • (2). 在 "prepay()" 方法中,因为不同的业务都会有属于自己的判断处理逻辑,
    所以,在使用时完全可以替换掉所调用的 "prepayOrderDeal()" 方法  ;# 相信没多大歧义吧!
    		 #【在此处,我建议进行一下微信支付金额的校对】
    		 # 比如,通过订单号到你的项目数据库中,查询出需要支付的金额再与此比较,
    		 # 只有符合你的要求才可以进行微信支付的下单操作
    
    • (3). 在 "pay()" 方法中

    建议对应当前的订单号,保存微信支付返回的 prepay_id

    • (4). 再有就是,在 "notify()" 这个回调方法中
    一定会涉及到自己业务的更新处理逻辑
        所以被调用的 "payNotifyOrderDeal()"方法中就可以改成你自己的业务逻辑了 (此处是可以自行补充的)
    

    	注意,此处传入的 "$result" 参数中,我主要使用的就是其中的 "out_trade_no" 和 "total_fee" 
    		# 包含着微信支付的众多信息,可自行提取
    	前者用于匹配我对该已支付订单的后续更新操作 
    		#【提示:我在使用时需要使用 "M" 进行字符串的截取才是我自己业务的实际订单编号哦!】;
    	后者是实际微信消费的金额,可用于数据表的记录,以方便对账人员的校对工作
    

    补充:

    1. 为了方便后期 微信退款功能 的扩展,建议对应订单保存回调得到的 $result
    2. 可以将其转化为 json 字符串形式 $wx_pay_result_json = json_encode($result);, 然后存储在订单表中,比如:
    3. 如果,直接进行微信退款功能的实现,请完成后,参考:小程序 微信退款功能实现讲解 (PHP方式)

    四、使用及测试效果

    ①. 测试效果

    • 在我的小程序项目中,唤醒的效果(开发工具中)如下:

    • 如果是在自己的手机端进行测试,在保证你的域名配置正确的情况下,唤醒的样式就是常见的样子:

    ②. 补充说明

    - 相信在实际配置使用的过程中一定会出现各种问题,我也是一点点的梳理排错过来的
    - 前面的多是些配置问题的规范,如果到了最后的唤醒阶段,出现的问题要注意查看开发工具的控制台,
    - 其中会有比较详细的报错信息,然后再进行排查解决
    - 有何问题,欢迎指摘,祝你配置顺利咯!
    

    ☆ 附录:

    ①. >>> Github 源码下载参考

    再做补充:如果,直接进行微信退款功能的实现,请完成后,参考:小程序 微信退款功能实现讲解 (PHP方式)

    ②. 总结

    • 通过对以上操作的梳理,可以提取出主要的几个步骤:
    -  小程序要开通你的微信支付功能 # 需要审核时间的
    -  审核通过后,紧接着进行"开通"操作 #可有两种开通方式进行选择的
    -  前后端重要信息配置完毕
    -  补充自己的特有逻辑处理操作 #pay/prepayOrderDeal()和 pay/payNotifyOrderDeal()
    -  支付回调成功后,进行后续的订单(项目服务器)查询操作
    
    展开全文
  • 微信小程序调用支付接口支付

    万次阅读 多人点赞 2019-03-17 13:07:45
    我前段时间做微信支付,遇到了很多坑,网上也没有讲解的特别明白的,通过借鉴各路人才的经验,最后也完成了,网上有很多讲解,我在这只讲一些注意点和解决的方法。我就讲讲我从完全懵到完成的过程吧。 在微信提供的...
  • 微信小程序调用微信支付接口

    万次阅读 多人点赞 2018-12-05 15:17:12
    前言:应项目要求,需要使用微信小程序支付,写完后告知手续费太高方案不予通过(宝宝心里苦,但宝宝不说)。此次开发在因站在巨人的肩膀上顺利完成。 微信支付文档传送门:...
  • 微信小程序支付

    2020-04-16 23:41:12
    uni.requestPayment是一个统一各平台的客户端支付API,不管是在某家小程序还是在App中,客户端均使用本API调用。...比如微信有App支付、小程序支付、H5支付等不同的申请入口和使用流程,对应到uni-app,在Ap...
  • 前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能。 传送门 借助小程序云开发实现小程序...
  • 小程序微信支付功能开发

    万次阅读 2019-03-19 08:44:38
    关于小程序内唤起微信支付功能,不同人有不同的思路,有嵌套H5页面的,也有跳转第三方链接网站的,也有放收钱码等图片的。 今天讲一下微信原生的微信支付功能基础版块,支付页面和支付逻辑。 先上个效果图: 页面...
  • 微信小程序支付详解:

    千次阅读 2018-09-12 18:50:02
    前段时间在公司的开发了一个微信小程序的项目,今天来说一说微信小程序的支付,有很多优秀的文章都说了小程序支付的 开发流程步骤,这里我们推荐一个博主以前就是看他的开发小程序支付:...
  • 这里我直接上代码,附有注释,直接把我的代码粘贴一下就可以用了,也是自己走了好多的弯路。。,写在博客里做个记录 直接把里面的参数替换成你的就可以了,...//小程序端代码: pay:function(){ var that=this...
  • 小程序如何开通微信支付

    万次阅读 2018-05-14 18:24:54
    目前开通微信小程序支付功能有两种方式,一个是你已经有微信商户号的情况下直接绑定一下商户号就可以了,另一个就是需要新申请一个微信支付的商户号。第一种:绑定已有微信支付商户号如果您开通过微信支付商户,绑定...
  • 微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付微信刷卡支付,异步处理支付结果等等...
  • 如果微信用户没有实名认证,微信零钱支付单笔限额1000元,每日限额1000元,每月限额2000元; 如果已经完成了实名认证,每日限额10000元。每年累计限额是20W。 手机银行限额 ...
  • 微信小程序如何接入微信支付

    万次阅读 2018-02-28 16:18:54
    本文阐述如何从零开始接入小程序支付,尤其适合没有微信支付接入经验的开发者。1. 申请微信支付小程序认证以后,可以在小程序后台,微信支付菜单栏,申请微信支付。填写企业信息和对公账户,微信支付会打一笔随机...
  • 一个大客户的
  • 微信小程序支付报 签名错误

    万次阅读 2018-05-31 20:50:27
    今天在开发小程序支付时,将之前的公众号appId改为了小程序的appId,将appKey改为了小程序的appSecret。再次进行支付时,报出了签名错误的问题!问题原因:微信支付时,需要几个参数:appId,appKey,mchId这三个...
  • 微信小程序支付源码 Demo 后台服务端代码

    万次阅读 多人点赞 2017-12-28 16:56:50
    微信小程序支付绕坑指南 步骤 A:小程序向服务端发送商品详情、金额、openid B:服务端向微信统一下单 C:服务器收到返回信息二次签名发回给小程序 D:小程序发起支付 E:服务端收到回调 源代码已经上传到 ...
  • 因为微信服务号支付,是微信商户号的一个支付功能,他们以前开通过,所以希望把这个利用起来,跟小程序支付绑定,今天子恒老师来跟你详细分享下实现的方法。一、 小程序绑定服务号支付需要注意的地方你的主体必须要...
  • 微信小程序 调用支付jsapi时缺少参数:total_fee
1 2 3 4 5 ... 20
收藏数 37,096
精华内容 14,838
关键字:

微信小程序支付