微信小程序支付功能 php后台对接完整代码分享
微信小程序支付,php后台对接完整代码,全是干货呀,拿过来可以直接使用。小程序在调起微信支付之前需要5个参数,这时候就需要携带code向后台请求,然后后台根据code获取openid再进行服务器之间的。
一、准备工作
1、小程序注册,要以公司的以身份去注册一个小程序,才有微信支付权限;
2、绑定商户号。
3、在小程序填写合法域
二、完成以上条件,你可以得到
小程序appid小程序秘钥 这两个用于获取用户openid;
商户号id,商户号秘钥 支付接口必须的;
三、开始开发
前台代码
/*
调起微信支付
@param支付价格,不填写默认为1分钱
*/
functionpay(total_fee){
vartotal_fee=total_fee;
wx.login({
success:res=>{
//code用于获取openID的条件之一
varcode=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){//后端返回的数据
vardata=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框架
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格式化返回给微信的数据格式]
*@Authorzhengmingzhou
*@DateTime2018-05-22
*@param[type]$arr[description]
*@return[type][description]
*/
privatefunctionarrtoxml($arr){
if(!$arr){
return'';
}else{
$xml="";
foreach($arras$key=>$val)
{
if(is_numeric($val)){
$xml.="<".$key.">".$val."".$key.">";
}else{
$xml.="<".$key.">".$key.">";
}
}
$xml.=" ";
return$xml;
}
}
//微信支付
publicfunctionpay(){
//获取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=authorization_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.'
'.$body.'
'.$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['paySign']=$this->sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;
$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'];
}
echojson_encode($data);
}
//随机32位字符串
privatefunctionnonce_str(){
$result='';
$str='QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
for($i=0;$i<32;$i++){
$result.=$str[rand(0,48)];
}
return$result;
}
//生成订单号
privatefunctionorder_number($openid){
//date('Ymd',time()).time().rand(10,99);//18位
returnmd5($openid.time().rand(10,99));//32位
}
//签名$data要先排好顺序
privatefunctionsign($data){
$stringA='';
foreach($dataas$key=>$value){
if(!$value)continue;
if($stringA)$stringA.='&'.$key."=".$value;
else$stringA=$key."=".$value;
}
$wx_key='';//申请支付后有给予一个商户账号和密码,登陆后自己设置的key
$stringSignTemp=$stringA.'&key='.$wx_key;
returnstrtoupper(md5($stringSignTemp));
}
//curl请求
publicfunctionhttp_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($curl,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
privatefunctionxml($xml){
$p=xml_parser_create();
xml_parse_into_struct($p,$xml,$vals,$index);
xml_parser_free($p);
$data="";
foreach($indexas$key=>$value){
if($key=='xml'||$key=='XML')continue;
$tag=$vals[$value[0]]['tag'];
$value=$vals[$value[0]]['value'];
$data[$tag]=$value;
}
return$data;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。