评论

tp5开发公众号微信支付

tp5开发微信公众号支付

接收前端传过来的openid和支付金额moneys和用户昵称nickName,提交给sendMoney方法

public function index(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实现微信支付的方法就已经结束啦,直接返回给前端就可以啦,大家觉得不错的话给个赞哦!

点赞 0
收藏
评论

1 个评论

  • 木木
    木木
    2020-11-01

    你好,能分享个文档地址吗,感觉微信的文档写的好乱,我都找不到

    2020-11-01
    赞同
    回复 1
    • Mr.zhao
      Mr.zhao
      2021-01-09
      没有文档地址  这是我自己写的 你需要的话我可以把这个php文件分享给你
      2021-01-09
      回复
登录 后发表内容