微信小程序支付功能 php后台对接完整代码分享

网友投稿 312 2023-01-29


微信小程序支付功能 php后台对接完整代码分享

微信小程序支付,php后台对接完整代码,全是干货呀,拿过来可以直接使用。小程序在调起微信支付之前需要5个参数,这时候就需要携带code向后台请求,然后后台根据code获取openid 再进行服务器之间的。

一、准备工作

1、小程序注册,要以公司的以身份去注册一个小程序,才有微信支付权限;

2、绑定商户号。

3、在小程序填写合法域

二、完成以上条件,你可以得到

小程序appid 小程序秘钥    这两个用于获取用户openzQrLEFid;

商户号id ,商户号秘钥     支付接口必须的;

三、开始开发

前台代码

/*

调起微信支付

@param 支付价格,不填写默认为1分钱

*/

function pay(total_fee) {

var total_fee = total_fee;

wx.login({

success: res => {

//code 用于获取openID的条件之一

var code = res.code;

wx.request({

url: '后台地址/index.php',

method: "POST",

data: {

total_fee:total_fee,

code: code,

},

header: {

'content-type': 'application/x-www-form-urlencoded' // 默认值

},

success: function (res) { //后端返回的数据

var data = res.data;

console.log(data);

console.log(data["timeStamp"]);

wx.requestPayment({

timeStamp: data['timeStamp'],

nonceStr: data['nonceStr'],

package: data['package'],

signType: data['signType'],

paySign: data['paySign'],

success: function (res) {

wx.showModal({

title: '支付成功',

content: '',

})

},

fail: function (res) {

console.log(res);

}

})

}

});

}

})

}

以下是PHP后台代码 ,这里用的是tp框架

namespace Home\Controller;

use Think\Controller;

class PayController extends Controller {

/**

* [callback 微信支付回调处理]

* @Author zhengmingzhou

* @DateTime 2018-05-22

* @return function [description]

*/

public function callback(){

vendor("Wechart.WxPay.Api");

vendor("Wechart.NativePay");

vendor("Wechart.WxPay.Data");

vendor("Wechart.WxPay.Notify");

//获取微信返回支付信息

$xml = $GLOBALS['HTTP_RAW_POST_DATA'];

$WxPayData = new \WxPayDataBase();

$result = $WxPayData->FromXml($xml);

if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){

//回调逻辑处理。。。

//返回给微信的参数

$data['RETURN_CODE'] = 'SUCCESS';

$data['RETURN_MSG'] = 'OK';

}else{

$data['RETURN_CODE'] = 'FAIL';

$data['RETURN_MSG'] = 'NO';

}

//返回给微信

$xml = self::arrtoxml($data);

echo $xml;

}

/**

* [arrtoxml 格式化返回给微信的数据格式]

* @Author zhengmingzhou

* @DateTime 2018-05-22

* @param [type] $arr [description]

* @return [type] [description]

*/

private function arrtoxml( $arr ){

if(!$arr){

return '';

}else{

$xml = "";

foreach ($arr as $key=>$val)

{

if (is_numeric($val)){

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

}else{

$xml.="<".$key."><![CDATA[".$val."]]>".$key.">";

}

}

$xml.="";

return $xml;

}

}

//微信支付

public function pay(){

//获取openid

if(I("post.code"))

{ //用code获取openid

$code=I("post.code");

$WX_APPID = '';//appid

$WX_SECRET = '';//AppSecret

$url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $WX_APPID . "&secret=" . $WX_SECRET . "&js_code=" . $code . "&grant_type=authorizahttp://tion_code";

$infos = json_decode(file_get_contents($url));

$openid = $infos->openid;

}

if(I("post.total_fee"))

{

$total_fee=I("post.total_fee");

}

else

{

$total_fee=0.01;

}

$fee = 0.01;//举例充值0.01

$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;//这里需要*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 = '

'.$appid.'

'.$mch_id.'

'.$nonce_str.'

'.$notify_url.'

'.$openid.'

'.$out_trade_no.'

'.$spbill_create_ip.'

'.$total_fee.'

'.$trade_type.'

'.$sign.'

';

//print_r($post_xml);die;

//统一接口prepay_id

$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';

$xml = $this->http_request($url,$post_xml);

$array = $this->xml($xml);//全要大写

//print_r($array);

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'] = 200;

$data['timeStamp'] = "$time";//时间戳

$data['nonceStr'] = $nonce_str;//随机字符串

$data['signType'] = 'MD5';//签名算法,暂支持 MD5

$data['package'] = 'prepay_id='.$array['PREPAY_ID'];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*

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

return strtoupper(md5($stringSignTemp));

}

//curl请求

public 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($curhttp://l, 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;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:共享文件系统如何下载(共享文件怎样下载)
下一篇:微信小程序实现弹出菜单功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~