在微信(用户扫码)支付中第一种开发模式中,
当用户扫码之后,在公众号中填写回调url,我
们不用这个方法,直接进行查询订单即可知道用户是否知否,
下面讲解一下查询订单php方法:
在进行查询之前我们要必须知道4个参数:
$key ='212332132132132'//公众号在申请微信支付的时候需要你自己的一个密匙
$appid = 'xxxxxxx';//进行收钱的公众号的appid
$mchid = '11111111';//公众号申请微信支付的时候微信给你提供的商户号
$ordernumber='2111111'//当买家在你们商城中买东西时候产生的订单号
------------
万事俱备只欠东风。
-------------
生成一个随机数
$str ="";
$length = 32;
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
//随机字符串
$nonce_str = $str;//随机字符串
然后根据上面的所有的数据进行签名处理
$arrayName = array('appid'=>$appid,'mch_id'=>$mchid,'out_trade_no'=>$ordernumber,'nonce_str'=>$nonce_str);
ksort($arrayName);
$sign = '';
foreach ($arrayName as $key => $value) {
$sign.='&'.$key.'='.$value;
}
//进行拼凑
//去掉开头的&并且进行MD5加密处理
$stringSignTemp = ltrim($sign,'&');
$stringSignTemp = $stringSignTemp.'&key='.$key;
$sign = md5($stringSignTemp);
$sign = strtoupper($sign);
这个sign就是签名,在微信开发中签名是很重要的。走不通这个其他都是白费
---------------
然后进行拼接xml数据形式,并且进行查询处理:
$xmldata = "<xml><appid>".$appid."</appid><mch_id>".$mchid."</mch_id><nonce_str>".$nonce_str."</nonce_str><out_trade_no>".$ordernumber."</out_trade_no><sign>".$sign."</sign></xml>";
$url = "https://api.mch.weixin.qq.com/pay/orderquery";/公众号查询订单的接口
$second = 30;
//证书验证与否
$useCert = true;
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
//如果有配置代理这里就设置代理
if(WxPayConfig::getValue('curl_proxy_host') != "0.0.0.0"
&& WxPayConfig::getValue('curl_proxy_port') != 0){
curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::getValue('curl_proxy_host'));
curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::getValue('curl_proxy_port'));
}
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::getValue('sslcert_path'));
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::getValue('sslkey_path'));
}
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
//运行curl
$xml = curl_exec($ch);
//返回结果
if($xml){
curl_close($ch);
//把xml转化成数组
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$arr = json_decode(json_encode($xmlstring),true);
if (isset($arr['trade_state']) && $arr['trade_state'] == 'SUCCESS') {
//到这步说明已经查询到订单成功,也就是说明用户已经付款了
}
}else{
$error = curl_errno($ch);
curl_close($ch);
throw new WxPayException("curl出错,错误码:$error");
当用户扫码之后,在公众号中填写回调url,我
们不用这个方法,直接进行查询订单即可知道用户是否知否,
下面讲解一下查询订单php方法:
在进行查询之前我们要必须知道4个参数:
$key ='212332132132132'//公众号在申请微信支付的时候需要你自己的一个密匙
$appid = 'xxxxxxx';//进行收钱的公众号的appid
$mchid = '11111111';//公众号申请微信支付的时候微信给你提供的商户号
$ordernumber='2111111'//当买家在你们商城中买东西时候产生的订单号
------------
万事俱备只欠东风。
-------------
生成一个随机数
$str ="";
$length = 32;
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
//随机字符串
$nonce_str = $str;//随机字符串
然后根据上面的所有的数据进行签名处理
$arrayName = array('appid'=>$appid,'mch_id'=>$mchid,'out_trade_no'=>$ordernumber,'nonce_str'=>$nonce_str);
ksort($arrayName);
$sign = '';
foreach ($arrayName as $key => $value) {
$sign.='&'.$key.'='.$value;
}
//进行拼凑
//去掉开头的&并且进行MD5加密处理
$stringSignTemp = ltrim($sign,'&');
$stringSignTemp = $stringSignTemp.'&key='.$key;
$sign = md5($stringSignTemp);
$sign = strtoupper($sign);
这个sign就是签名,在微信开发中签名是很重要的。走不通这个其他都是白费
---------------
然后进行拼接xml数据形式,并且进行查询处理:
$xmldata = "<xml><appid>".$appid."</appid><mch_id>".$mchid."</mch_id><nonce_str>".$nonce_str."</nonce_str><out_trade_no>".$ordernumber."</out_trade_no><sign>".$sign."</sign></xml>";
$url = "https://api.mch.weixin.qq.com/pay/orderquery";/公众号查询订单的接口
$second = 30;
//证书验证与否
$useCert = true;
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
//如果有配置代理这里就设置代理
if(WxPayConfig::getValue('curl_proxy_host') != "0.0.0.0"
&& WxPayConfig::getValue('curl_proxy_port') != 0){
curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::getValue('curl_proxy_host'));
curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::getValue('curl_proxy_port'));
}
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::getValue('sslcert_path'));
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::getValue('sslkey_path'));
}
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
//运行curl
$xml = curl_exec($ch);
//返回结果
if($xml){
curl_close($ch);
//把xml转化成数组
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$arr = json_decode(json_encode($xmlstring),true);
if (isset($arr['trade_state']) && $arr['trade_state'] == 'SUCCESS') {
//到这步说明已经查询到订单成功,也就是说明用户已经付款了
}
}else{
$error = curl_errno($ch);
curl_close($ch);
throw new WxPayException("curl出错,错误码:$error");
}
//curl部分不要照抄我的,我的是我的环境才那样写的你要用你的curl写才行根据你的环境