php微信h5支付

公司最近申请到了微信h5支付的资格,这个功能以前只对合作商家开放,现在都可以申请了,下面来讲解一下微信h5支付的流程

第一步

微信的所有支付第一步都是 统一下单 参数可在官方文档查看   微信H5支付文档

用户点击微信支付,此时后台根据用户的订单信息,向微信发送统一下单的请求

//微信h5支付
$param['appid'] = "xxxxxxxxxxxx";//微信支付的appid
$param['body'] = "微信支付body";//微信支付的商品描述
$param['mch_id'] = "xxxxxxxxx";//微信支付的mch_id
$param['nonce_str'] = $order_arr['data']['OrderCode'];//随机字符串
$param['notify_url'] = "http://xxxx.xxxx.com/wx_h5_callback.php";//回调地址 这个地址需要微信支付后台配置白名单 上限貌似是五个
$param['out_trade_no'] = $order_arr['data']['OrderCode'];//商户订单号
$param['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'];//终端ip
$param['total_fee'] = $price*100;//价格 单位分
$param['trade_type'] = "MWEB";//交易类型 h5支付的交易类型必须为MWEB
$param['scene_info'] = '{"h5_info": {"type":"Wap","wap_url": "http://xxx.xxxxxx.com","wap_name": "网站名称"}}';//场景信息


//按照微信规则生成签名
$sign = makeWXsign($param,$key);//key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

//拼接xml数据
$send = "<xml>
            <appid>{$param['appid']}</appid>
            <attach>{$param['attach']}</attach>
            <body>{$param['body']}</body>
            <mch_id>{$param['mch_id']}</mch_id>
            <nonce_str>{$param['nonce_str']}</nonce_str>
            <notify_url>{$param['notify_url']}</notify_url>
            <out_trade_no>{$param['out_trade_no']}</out_trade_no>
            <spbill_create_ip>{$param['spbill_create_ip']}</spbill_create_ip>
            <total_fee>{$param['total_fee']}</total_fee>
            <trade_type>{$param['trade_type']}</trade_type>
            <scene_info>{$param['scene_info']}</scene_info>
            <sign>{$sign}</sign>
        </xml>";
                
                
//向微信发送请求
$result=postXmlCurl($send,"https://api.mch.weixin.qq.com/pay/unifiedorder");


/*********过程中用到的两个函数***********/
//微信支付签名生成函数
function makeWXQM($arr,$key){

    ksort($arr);
    $str='';
    foreach($arr as $k=>$v){
        $str.=$k.'='.$v.'&';
    }

    $str.='key='.$key;

    return strtoupper(md5($str));

}

//给微信发送请求函数
function postXmlCurl($xml, $url, $second = 30)
{
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOPT_TIMEOUT, $second);

    curl_setopt($ch,CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
    //设置header
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    //要求结果为字符串且输出到屏幕上
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    //post提交方式
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    //运行curl
    $data = curl_exec($ch);
    //返回结果
    if($data){
        curl_close($ch);
        return $data;
    } else {
        $error = curl_errno($ch);
        curl_close($ch);
        die("curl出错,错误码:$error");
    }
}

2 调起支付

第一步发送请求如果成功的话$result就是微信返回给我们的有用的数据,接下来用这个数据来调起支付

$return_arr = xml_to_array($result);


//设置支付成功跳转地址
$return_url = urlencode("http://xxxx.xxxx.com");//支付完成后你要跳转的地址

//跳转此链接拉起微信支付
header("location:".$return_arr['mweb_url']."&redirect_url={$return_url}");//拉起微信支付链接(并且附上$return_url)
exit;


/****用到的函数*****/

xml_to_array($xml){
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $values;
}

此时手机上应该已经唤醒微信进行支付了 接下来看看支付完成后的处理

3 支付回调

根据第一步我们设置的回调地址,支付完成后微信会给我们的回调地址发送支付成功或者失败的信息,此时我们需要修改相应的订单状态

此处的逻辑根据自己的需求不同而不同,这里就不列举了,需要注意的一点是就微信异步通知发送的xml数据,回调地址解析xml数据并且处理就可以了

ps:微信h5支付只适用于手机端非微信浏览器,在pc端或者手机微信内是无法拉起支付的,大家在开发过程中有问题请在此留言或者联系我的邮箱

 个人原创内容 转载请注明出处

原文地址:https://www.cnblogs.com/zwsblogs/p/8523432.html