小程序与php 实现微信支付

小程序访问地址:

payfee.php:

include'WeixinPay.php';

$appid='';

$openid= $_GET['id'];

$mch_id='';

$key='';

$out_trade_no = $mch_id. time();

$total_fee = $_GET['fee'];

if(empty($total_fee))//押金

{

$body ="充值押金";

$total_fee = floatval(99*100);

}

else{

$body ="充值余额";

$total_fee = floatval($total_fee*100);

}

$weixinpay =newWeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee);

$return=$weixinpay->pay();

echojson_encode($return);

WeixinPay.php:


/*

* 小程序微信支付

*/

classWeixinPay{

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;

    }

publicfunctionpay(){

//统一下单接口

$return =$this->weixinapp();

return$return;

    }

//统一下单接口

privatefunctionunifiedorder(){

$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;

    }

privatestaticfunctionpostXmlCurl($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);

thrownewWxPayException("curl出错,错误码:$error");

        }

    }




//数组转换成xml

privatefunctionarrayToXml($arr){

$xml ="";

foreach($arras$key => $val) {

if(is_array($val)) {

$xml .="<". $key .">". arrayToXml($val) ."";

}else{

$xml .="<". $key .">". $val ."";

            }

        }

$xml .="";

return$xml;

    }

//xml转换成数组

privatefunctionxmlToArray($xml){

//禁止引用外部xml实体

libxml_disable_entity_loader(true);

$xmlstring = simplexml_load_string($xml,'SimpleXMLElement', LIBXML_NOCDATA);

$val = json_decode(json_encode($xmlstring),true);

return$val;

    }

//微信小程序接口

privatefunctionweixinapp(){

//统一下单接口

$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位

privatefunctioncreateNoncestr($length =32){

$chars ="abcdefghijklmnopqrstuvwxyz0123456789";

$str ="";

for($i =0; $i < $length; $i++) {

$str .= substr($chars, mt_rand(0, strlen($chars) -1),1);

        }

return$str;

    }

//作用:生成签名

privatefunctiongetSign($Obj){

foreach($Objas$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_;

    }

///作用:格式化参数,签名过程需要使用

privatefunctionformatBizQueryParaMap($paraMap, $urlencode){

$buff ="";

        ksort($paraMap);

foreach($paraMapas$k => $v) {

if($urlencode) {

                $v = urlencode($v);

            }

$buff .= $k ."=". $v ."&";

        }

        $reqPar;

if(strlen($buff) >0) {

$reqPar = substr($buff,0, strlen($buff) -1);

        }

return$reqPar;

    }

}

小程序页面处理:

wx.request({

url:'https://www.yourhost.com/weixin/WeiActivity/payfee.php',//改成你自己的链接

header:{

'Content-Type':'application/x-www-form-urlencoded'

},

method:'POST',

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('success');

wx.showToast({

title:'支付成功',

icon:'success',

duration:3000

});

},

'fail':function(res){

console.log('fail');

},

'complete':function(res){

console.log('complete');

}

});

},

fail:function(res){

console.log(res.data)

}

});

回调url:notify.php

$postXml = $GLOBALS["HTTP_RAW_POST_DATA"];//接收微信参数

if(empty($postXml)) {

returnfalse;

}

//将xml格式转换成数组

functionxmlToArray($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];

以上几步你就可以完成小程序的微信支付与php完美的结合起来

欢迎工作一到十年的Java工程师朋友们加入Java进阶高级架构:828545509

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

你可能感兴趣的:(小程序与php 实现微信支付)