微信小程序> 微信小程序完成小程序支付功能

微信小程序完成小程序支付功能

浏览量:930 时间: 来源:极乐叔

最近开发小程序,一直在看小程序的支付。经过一天的努力,小程序支付功能最终实现了。

下面感谢 csdn 博主:千堆雪惹尘埃 发布的 " 小程序与php 实现微信支付 "


原文地址:

blog.csdn.net/admin1008

下面是我自己写的代码:使用的 thinkphp:其他的可以参考修改:


服务端:

获取用户的 openid:

public function get_openid(){     $data = array();            $url = "https://api.weixin.qq.com/sns/jscode2session";    $data['appid'] = I('get.appid','','trim'); // 小程序的app_id $data['secret'] = I('get.secret','','trim'); //小程序的 app_secret $data['js_code'] = I('get.js_code','','trim');    $data['grant_type'] = "authorization_code";    $res = $this-http_request($url,$data);    echo $res;}


支付接口:

public function wxPay(){    $openID = I('get.openid','','trim');    $totalFee = I('get.total_fee','','trim');    $title = I('get.title','','trim');    // 具体配置 $appid = "填写小程序的 appid"; //小程序 appid $openid = $openID; // 用户的openid $mch_id = "填写商户号"; //商户号 $key = "填写商户号的秘钥";     $out_trade_no = $this-order_number();//商户订单号   $body = $title;     $total_fee = $totalFee;//总金额 单位 分   $weixinpay = new ComponentsWeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee);    $result = $weixinpay-pay();    echo json_encode($result); }


生成随机字符串和订单号:

//随机32位字符串 private function nonce_str(){    $result = '';    $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';    for ($i=0;$i32;$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位}


支付回调接口:

// 支付回调地址 public function notify(){    $postXml = $GLOBALS["HTTP_RAW_POST_DATA"]; //接收微信参数   if (empty($postXml)) {          return false;      }            //将xml格式转换成数组   function xmlToArray($xml) {                //禁止引用外部xml实体           libxml_disable_entity_loader(true);                $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);                $val = json_decode(json_encode($xmlstring), true);                return $val;      }            $attr = xmlToArray($postXml);            $total_fee = $attr[total_fee];      $open_id = $attr[openid];      $out_trade_no = $attr[out_trade_no];      $time = $attr[time_end]; }


小程序JS:

//index.js//获取应用实例const app = getApp()const APP_ID = "小程序的appid";//输入小程序的appidconst APP_SECRET = "小程序的app_secret";//输入小程序app_secret  var OPEN_ID = "";//储存获取到openid  var SESSION_KEY = "";//储存获取到session_key   Page({  data:{    'message':"发起支付"  },  wxPay:function(){    var that = this;    wx.login({      success:function(res){        wx.request({          url:"https://xiaochengxu.e0yu.com/index.php?s=Index/get_openid",          data:{            appid: APP_ID,            secret:APP_SECRET,            js_code:res.code,            grant_type: 'authorization_code'           },          method:'GET',          success:function(res){            //console.log(res);            OPEN_ID = res.data.openid;//获取到的openid             wx.request({              url: "https://xiaochengxu.e0yu.com/index.php?s=Index/wxPay",              data:{                openid:OPEN_ID,                total_fee:1,//充值金额 单位"分"                title:'商品标题'              },              method:'GET',              success:function(result){                //console.log(result);                console.log('调起支付');                wx.requestPayment({                  'timeStamp': result.data.timeStamp,                  'nonceStr': result.data.nonceStr,                  'package': result.data.package,                  'signType': 'MD5',                  'paySign': result.data.paySign,                  'success': function (res) {                    console.log('success');                  },                  'fail': function (res) {                    console.log('fail');                  },                  'complete': function (res) {                    console.log('complete');                  }                });              }            })          },        })      }    });  }})


效果 :

小程序

下面给出:WeixinPay:

?phpnamespace Components;/* 小程序微信支付 */ class WeixinPay {    protected $appid;    protected $mch_id;    protected $key;    protected $openid;    protected $out_trade_no;    protected $body;    protected $total_fee;            function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {        $this-appid = $appid;        $this-openid = $openid;        $this-mch_id = $mch_id;        $this-key = $key;        $this-out_trade_no = $out_trade_no;        $this-body = $body;        $this-total_fee = $total_fee;    }    public function pay() {        //统一下单接口 $return = $this-weixinapp();        return $return;    }    //统一下单接口 private function unifiedorder() {        $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';        $parameters = array(            'appid' = $this-appid, //小程序ID            'mch_id' = $this-mch_id, //商户号            'nonce_str' = $this-createNoncestr(), //随机字符串//            'body' = 'test', //商品描述            'body' = $this-body,//            'out_trade_no' = '2015450806125348', //商户订单号            'out_trade_no'= $this-out_trade_no,//            'total_fee' = floatval(0.01 * 100), //总金额 单位 分            'total_fee' = $this-total_fee,//            'spbill_create_ip' = $_SERVER['REMOTE_ADDR'], //终端IP            'spbill_create_ip' = '192.168.0.161', //终端IP            'notify_url' = 'http://www.weixin.qq.com/wxpay/pay.php', //通知地址  确保外网能正常访问            'openid' = $this-openid, //用户id            'trade_type' = 'JSAPI'//交易类型         );        //统一下单签名 $parameters['sign'] = $this-getSign($parameters);        $xmlData = $this-arrayToXml($parameters);        $return = $this-xmlToArray($this-postXmlCurl($xmlData, $url, 60));        return $return;    }    private static function postXmlCurl($xml, $url, $second = 30)     {        $ch = curl_init();        //设置超时        curl_setopt($ch, CURLOPT_TIMEOUT, $second);        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验        //设置header        curl_setopt($ch, CURLOPT_HEADER, FALSE);        //要求结果为字符串且输出到屏幕上        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);        //post提交方式        curl_setopt($ch, CURLOPT_POST, TRUE);        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);        curl_setopt($ch, CURLOPT_TIMEOUT, 40);        set_time_limit(0);        //运行curl $data = curl_exec($ch);        //返回结果 if ($data) {            curl_close($ch);            return $data;        } else {            $error = curl_errno($ch);            curl_close($ch);            throw new WxPayException("curl出错,错误码:$error");        }    }                //数组转换成xml private function arrayToXml($arr) {        $xml = "root";        foreach ($arr as $key = $val) {            if (is_array($val)) {                $xml .= "" . $key . "" . arrayToXml($val) . "/" . $key . "";            } else {                $xml .= "" . $key . "" . $val . "/" . $key . "";            }        }        $xml .= "/root";        return $xml;    }    //xml转换成数组 private function xmlToArray($xml) {        //禁止引用外部xml实体          libxml_disable_entity_loader(true);        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);        $val = json_decode(json_encode($xmlstring), true);        return $val;    }    //微信小程序接口 private function weixinapp() {        //统一下单接口 $unifiedorder = $this-unifiedorder();//        print_r($unifiedorder); $parameters = array(            'appId' = $this-appid, //小程序ID            'timeStamp' = '' . time() . '', //时间戳            'nonceStr' = $this-createNoncestr(), //随机串            'package' = 'prepay_id=' . $unifiedorder['prepay_id'], //数据包            'signType' = 'MD5'//签名方式         );        //签名 $parameters['paySign'] = $this-getSign($parameters);        return $parameters;    }    //作用:产生随机字符串,不长于32位 private function createNoncestr($length = 32) {        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";        $str = "";        for ($i = 0; $i  $length; $i++) {            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);        }        return $str;    }    //作用:生成签名 private function getSign($Obj) {        foreach ($Obj as $k = $v) {            $Parameters[$k] = $v;        }        //签名步骤一:按字典序排序参数 ksort($Parameters);        $String = $this-formatBizQueryParaMap($Parameters, false);        //签名步骤二:在string后加入KEY $String = $String . "&key=" . $this-key;        //签名步骤三:MD5加密 $String = md5($String);        //签名步骤四:所有字符转为大写 $result_ = strtoupper($String);        return $result_;    }    ///作用:格式化参数,签名过程需要使用 private function formatBizQueryParaMap($paraMap, $urlencode) {        $buff = "";        ksort($paraMap);        foreach ($paraMap as $k = $v) {            if ($urlencode) {                $v = urlencode($v);            }            $buff .= $k . "=" . $v . "&";        }        $reqPar;        if (strlen($buff)  0) {            $reqPar = substr($buff, 0, strlen($buff) - 1);        }        return $reqPar;    }}


作者:帅到要去报警
链接:微信小程序 --- 完成小程序支付功能
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎