微信小程序微信小程序开发

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

2018-03-12  本文已影响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;  
    }  
}  
?>  

上一篇 下一篇

猜你喜欢

热点阅读