zoukankan      html  css  js  c++  java
  • 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端或者手机微信内是无法拉起支付的,大家在开发过程中有问题请在此留言或者联系我的邮箱

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

  • 相关阅读:
    第三篇:数据仓库系统的实现与使用(含OLAP重点讲解)
    Django框架ORM单表删除表记录_模型层
    Django创建模型_模型层
    Django框架ORM单表添加表记录_模型层
    Django框架打印orm转换过程中的sql_模型层
    Django框架创建数据库表时setting文件配置_模型层
    UCRT: VC 2015 Universal CRT, by Microsoft
    vs2015部署---下一代VC运行时库系统:the Universal CRT
    VS2015开发的C++应用如何不依赖Visual C++ 2015 redistributable?
    C++11并发之std::thread
  • 原文地址:https://www.cnblogs.com/zwsblogs/p/8523432.html
Copyright © 2011-2022 走看看