微信小程序支付功能 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=''; //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; } } '.$appid.' '.$body.''.$mch_id.' '.$nonce_str.' '.$notify_url.' '.$openid.' '.$out_trade_no.' '.$spbill_create_ip.' '.$total_fee.' '.$trade_type.' '.$sign.'
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。