今天小编跟大家讲解下有关微信H5支付,看完这个你一定就懂了 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关微信H5支付,看完这个你一定就懂了 的相关资料,希望小伙伴们看了有所帮助。
一、说在前面的话1.微信H5支付一定要开通,没开通就别扯淡了,它和APP支付不是一个
2.微信支付后台一定要配置js安全域,否则支付时可能会因为地址不在该域下导致支付失败(提示商户参数配置错误,其实跟参数没半毛关系)
3.微信的价格1是1分,所以价格total_fee参数没有零点几几的情况。(支付宝0.01是一分)
4.微信请和返回都是XML格式,注意转化,可以写个公共方法
5.你可以设置支付成功后的回调页面,但是:要对整个回调redirect_url进行urlencode处理
别特么只知道处理域名,不管参数
二、直接上代码(按照步骤加解读,自己抽离相关方法)1.整理所有H5支付的参数,数组格式
$scene = ['h5_info' => ['type' => 'h5_info', 'app_name' => 'H5支付', 'package_name' => 'baoming']];//这个参数一定要加$scene = json_encode($scene);$param = [ 'appid'=>$config['appid'],//产品ID 'mch_id'=>$config['mch_id'],//商户ID 'nonce_str'=> $nonce_str,//16位随机数 'body'=>'点购买', 'out_trade_no' => $oid,//订单ID 'total_fee'=> $price,//价格 'spbill_create_ip'=>\S\Util\Ip::getClientIp(),//真实ID 'notify_url'=>$notify_url,//微信通知你支付结果的接口 'trade_type'=> 'MWEB',//一定是这个值 'scene_info'=> $scene,//信息,其实这个参数是必须的]; ksort($param);$str = ''; foreach ($param as $key=>$value){ $str .= $key.'='.$value.'&';} $sign_str = $str.'key='.$config['key'];$sign = strtoupper(md5($sign_str));$param['sign'] = $sign;//生成规定的sign校验值$post_data = $this->arrayToXml($param);//生成微信要求的XML格式return $this->doPay($post_data);//返回结果2.将所有的参数格式整理为XML格式(对应上文中的函数)
public function arrayToXml($arr){ $xml ="<xml>"; foreach ($arr as $key=>$val){ if(is_numeric($val)){ $xml.="<".$key.">".$val."</".$key.">"; }else{ $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } } $xml.="</xml>"; return $xml; }3.请求支付,并返回结果(XML结果,需要处理下格式,我的函数中已经处理)
public function doPay($data) { $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, 30000); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $res = curl_exec($ch); curl_close($ch); //处理XML libxml_disable_entity_loader(true); $data = json_decode(json_encode(simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA)), true); \S\Log\Logger::getInstance()->info(array(json_encode($data),'微信生成prepayid')); return $data['return_code'] == 'SUCCESS' ? $data['mweb_url'] : '';//返回的时,H5中调起微信支付的链接地址 }来源:爱蒂网