美文网首页微信小程序微信小程序开发
微信小程序&PHP 微信支付接口调用

微信小程序&PHP 微信支付接口调用

作者: 阿_莫西林 | 来源:发表于2018-03-12 16:18 被阅读143次

    小程序端

    /** 
       * 微信支付接口 
       */  
      wxPaymoney:function (out_trade_no, true_money){    //out_trade_no 后台统一下单接口需要用  
        var that = this  
        wx.hideToast()                   //隐藏toast  
        wx.request({  
          method: 'POST',  
          data: {  
            openid: '************',    //调用人的openid  
            out_trade_no: out_trade_no,  
            body: '答题奖金',    
            no****rl: 'https://www.q**************.php',//后台接口自动修改订单状态  
            t*****e: true_money     //支付金额  
          },  
          url: 'https://b***************gn.php',        //服务器接口(微信统一下单接口)  
          header: {  
            'Content-Type': 'application/x-www-form-urlencoded'  
          },  
          success: function (res) {  
            console.log(res.data)  
            console.log('调起支付')  
            wx.requestPayment({                //成功之后,调用小程序微信支付  
              'timeStamp': res.data.timeStamp,  
              'nonceStr': res.data.nonceStr,  
              'package': res.data.package,  
              'signType': 'MD5',  
              'paySign': res.data.paySign,  
              success: function (res) {  
                console.log(res)  
                wx.showToast({  
                  title: '支付成功',  
                  icon: 'success',  
                  duration: 3000  
                })  
              },   
              fail: function (res) {  
                console.log('付款失败');  
                wx.showModal({  
                  title: '提醒',  
                  content: '付款失败,如要出题请重新编辑题目',  
                  showCancel: false,  
                  success:function(){  
                    wx.redirectTo({  
                      url: '/pa*******ndex',  
                    })  
                  }  
                })  
                return  
              },  
            })  
          },  
          fail: function (res) {  
            console.log(res.data)  
          }  
        })  
      }  
    

    服务器端

    <?php  
    $appid='********';        //准备数据(都在后台系统中可查到)  
    $mch_id='12******02';        //商户号  
    $key='lk******aFK12';  
    $openid = trim($_POST['openid']);  
    //$out_trade_no = $mch_id.time();  
    $out_trade_no = trim($_POST['out_trade_no']);  
    //$body = "答题奖金";  
    $body = $_POST['body'];  
    //$notify_url = 'http://w***************y.php';  
    $notify_url = trim($_POST['notify_url']);  
    $to**ee = floatval($_POST['to****e']);  
    $str = var_export($_POST,true);  
    file_put_contents("set.txt",$str."\n",FILE_APPEND);  
      
    $weixinpay = new WeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$to****,$notify_url);  
    $return=$weixinpay->pay();  
    echo json_encode($return);  
    /* 
     * 小程序微信支付 
     */  
    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,$notify_url) {  
            $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 = $to****e;  
            $this->notify_url = $notify_url;  
        }  
        public function pay() {  
            //统一下单接口  
            $return = $this->weixinapp();  
            return $return;  
        }  
        //微信小程序接口  
        private function weixinapp() {  
            //统一下单接口  
            $unifiedorder = $this->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;  
        }  
        //统一下单接口  
        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' => $this->body,  
                'out_trade_no'=> $this->out_trade_no,  
                'total_fee' => $this->t***ee,  
                'spbill_create_ip' => '1****8', //终端IP  
                'notify_url' => $this->notify_url, //通知地址  确保外网能正常访问  
                '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;  
        }  
        //作用:产生随机字符串,不长于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;  
        }  
    }  
    ?>  
    
    

    相关文章

      网友评论

        本文标题:微信小程序&PHP 微信支付接口调用

        本文链接:https://www.haomeiwen.com/subject/wxanfftx.html