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

来源:互联网 发布:断食四天减肥知乎 编辑:程序博客网 时间:2024/04/29 23:48

遇到的问题是微信扫码支付可以成功,但是扫码成功之后的回调函数却怎么也没有反应。
呐呐呐,敲黑板,划重点了,在网上看了好多资料说,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;    }
阅读全文
0 0