接收前端传过来的openid和支付金额moneys和用户昵称nickName,提交给sendMoney方法
publicfunctionindex(Request$request){$openid=$request->param('openid');//获取openId$money=$request->param('money');//支付金额return$this->sendMoney($moneys,$openid,'支付简介',$nickName);}}
|
2.详解sendMoney方法
①将商户账户appid、商户号、随机字符串(见createNocestr方法)、商户订单号、用户的oepnid、支付金额、充值描述信息、ip地址、trade_type(这里用的是JSAPI)、回调地址拼成数组array
②过滤函数、拼接字符串
③将商户秘钥key和字符串拼接起来,用md5得到sign并且用strtoupper转换成大写
④拼接成xml格式(见arraytoxml)方法
⑤调用统一下单接口https://api.mch.weixin.qq.com/pay/unifiedorder
⑥判断如果回调函数return_code和result_code的值都为SUCCESS的话则进行二次签名(非常重要)
⑦将appId(必须大写)、nonceStr、package(拼接成prepay_id=)、signType(MD5)、timeStamp拼成数组,过滤函数,拼接字符串,商户key,md5加密并转换成大写,得到二次签名
public function sendMoney($amount,$re_openid,$desc='你的简介',$check_name=''){ header("Content-Type: text/html; charset=utf-8"); $total_amount = (100) * $amount;//充值的金额 $data=array( 'appid'=> '',//商户账号appid 'mch_id'=> '',//商户号 'nonce_str'=> $this->createNoncestr(),//随机字符串 'out_trade_no'=> date('YmdHis').rand(1000, 9999),//商户订单号 'openid'=> $re_openid,//用户openid 'total_fee'=>$total_amount,//金额 'body'=> $desc,//充值描述信息 'spbill_create_ip'=> '',//Ip地址 'trade_type'=>'JSAPI', 'notify_url'=>''//你的回调地址 ); $secrect_key = '';//API密码 $data = array_filter($data);//过滤函数 ksort($data); $str =''; foreach($data as $k=>$v) { $str.=$k.'='.$v.'&'; } $str.='key='.$secrect_key;//把秘钥和字符串拼接起来 $data['sign'] = strtoupper(md5($str));//用md5得到sign 转换成大写 $xml = $this->arraytoxml($data);//拼接成xml的格式 $url='https://api.mch.weixin.qq.com/pay/unifiedorder'; //调用接口 $res = $this->wx_curl($xml,$url); $return = $this->xmltoarray($res); $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA); $jsonStr = json_encode($responseObj);//转换为字符串 $jsonArray = json_decode($jsonStr,true);//转换为数组 if($jsonArray['return_code']==='SUCCESS' && $jsonArray['result_code']==='SUCCESS'){ $time = time();//时间戳 $info = array( 'appId'=>'', 'nonceStr'=>$jsonArray['nonce_str'], 'package'=>'prepay_id='.$jsonArray['prepay_id'], 'signType'=>'MD5', 'timeStamp'=>"".$time."", ); $info_s = array_filter($info);//过滤函数 ksort($info_s); $str_s =''; foreach($info as $k=>$v) { $str_s.=$k.'='.$v.'&'; } $str_s.='key=你的商户秘钥';//把秘钥和字符串拼接起来 $info['sign']=strtoupper(md5($str_s)); $infos = array( 'status'=>1, 'content'=>'success', 'result'=>$info ); return $infos; }else{ return json([ "status"=>0, "content"=>$jsonArray['return_msg'], "result"=>$jsonArray['err_code_des'] ]); } } |
3.createNocestr随机字符串方法
public 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;} |
4.arraytoxml拼接成xml
public function arraytoxml($data){ $str='<xml>'; foreach($data as $k=>$v) { $str.='<'.$k.'>'.$v.'</'.$k.'>'; } $str.='</xml>'; return $str; }/*拼接xml*/public function xmltoarray($xml) { libxml_disable_entity_loader(true);//禁止引用外部xml实体$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $val = json_decode(json_encode($xml),true); return $val; } |
5.MD5加密方法
public function sign($info){ $key=''; ksort($info); $buff = ""; foreach ($info as $k => $v) { if($k!="sign" && $v!="" && !is_array($v)){ $buff.="".$v."&"; } } $buff = trim($buff,"&"); $string=$buff."&key=".$key; $string = md5($string); $sign = strtoupper($string); return $sign;} |
到此tp5实现微信支付的方法就已经结束啦,直接返回给前端就可以啦,大家觉得不错的话给个赞哦!
