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

更多相关文章

  1. 在ajax中接收php多维数组。
  2. 查找具有特定数据字符串的数组并返回其具有的另一个数据字符串
  3. 当excel表格单元格的格式是日期格式非文本格式的时候,phpexcel 应
  4. 使用PHP读取特定XML节点上特定数组的值
  5. 从数组中回显键和值
  6. Laravel将动态输入数据数组保存到数据库中
  7. PHP格式化日期,显示“刚刚,几分钟前,几小时前,几天前,几个月前”
  8. 在多维数组中查找最小值并返回键
  9. 如何使用变量访问多维数组中的某些元素?

随机推荐

  1. 真实IT领域2/8法则,扎心了!
  2. Vue.js实现的3D Tab菜单
  3. 经典jQuery多过渡动画焦点图插件
  4. 封装一个流水号ID生成器:id-spring-boot-s
  5. HTML5 五子棋游戏
  6. SVG超酷动画Tab菜单栏
  7. Vue.js流程图插件 可自定义流程节点事件
  8. HTML5 圆盘秒表动画 可暂停重启计时
  9. Vue.js 圆形CSS3渐变色拾取器
  10. Vue.js任务列表 可本地存储任务数据