牛骨文教育服务平台(让学习变的简单)
博文笔记

PHP在PC端实现微信扫码支付模式二

创建时间:2017-09-19 投稿人: 浏览次数:616

遇到的问题是微信扫码支付可以成功,但是扫码成功之后的回调函数却怎么也没有反应。
呐呐呐,敲黑板,划重点了,在网上看了好多资料说,PHP的PC端微信扫码支付模式二这个回调就是不会响应的!然后,这个回调函数在链接上是不能跟参数的,并且模式一需要在微信开发者后台配置回调地址。
所以不能太依赖它这个回调,需要自己实现微信订单查询的API,当查询结果trade_state为SUCCESS时,表明支付成功,然后处理支付成功之后的业务逻辑。
下面附上自己的订单查询代码:

static function orderQuery($data)
    {
        $url = "https://api.mch.weixin.qq.com/pay/orderquery";
        $input = array();
        $input["appid"] = "";            //APPID
        $input["mch_id"] = "";           //商户号
        $input["nonce_str"] = SELF::getNonceStr();
        //var_dump($input["nonce_str"]);

        $input["out_trade_no"] = $data["is_ordered"];
        //生成签名

        $sign = "appid=&mch_id=&nonce_str=".$input["nonce_str"]."&out_trade_no=".$data["is_ordered"]."&key=";    //key API密钥
        $sign = strtoupper(md5(urldecode($sign)));
        $input["sign"] = $sign;
        //var_dump($sign);
        $xml = SELF::ToXml($input);
        //var_dump($xml);

        $timeOut = 6;
        $startTimeStamp = self::getMillisecond();//请求开始时间
        $response = self::postXmlCurl($xml, $url, false, $timeOut);
        $result = SELF::Init($response);
        //self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间
        return $result;
    }

生成随机数

public static function getNonceStr($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str ="";
        for ( $i = 0; $i < $length; $i++ )  {
            $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
        }
        return $str;
    }

数组转化成xml格式

public static function ToXml($input)
    {

        if(empty($input)
            || count($input) <= 0)
        {
            throw new WxPayException("数组数据异常!");
        }

        $xml = "<xml>";
        foreach ($input as $key=>$val)
        {
            if (is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }

发送请求

private static function postXmlCurl($xml, $url, $useCert = false, $second)
    {

        $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);

        if($useCert == true){
            //设置证书
            //使用证书:cert 与 key 分别属于两个.pem文件
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,"PEM");
            curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,"PEM");
            curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);
        }
        //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);
            throw new WxPayException("curl出错,错误码:$error");
        }
    }

请求的结果是xml格式的需要转化成数组格式

public static function Init($xml)
    {
        $array_data = json_decode(json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA)), true);
        return $array_data;
    }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。