官方指南:《查询订单API》
//根据微信订单号查询
https://api.mch.weixin.qq.com/v3/pay/transactions/id/1217752501201407033233368018?mchid=1230000109
//根据商户订单号查询
https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/1217752501201407033233368018?mchid=1230000109
总体比较简单,就是根据订单号问微信要结果,当然直接用链接肯定不行,还是需要提供签名,否则就会提示http头错误。
{“code”:“SIGN_ERROR”,“message”:“Http头Authorization值格式错误,请参考《微信支付商户REST API签名规则》”}
// 1.信息准备
$mchid = 'wx1234567890abcdefgh';//商户id
$xlid = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';//证书序列号
$apiclient_key = 'apiclient_key.pem';//证书签名,官网下载,存放于服务器本地,注意路径
$time = time(); //时间戳
$orderid = 'orderid_1234567890abcdefghijklmn';//订单编号
$noncestr = md5($orderid.$time.rand());//随机字符串,可以将订单编号存于此处
$apiurl = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/'.$orderid.'?mchid='.$mchid;
$urlarr = parse_url($apiurl);
$url = $urlarr['path'].(!empty($urlarr['query'])?'?'.$urlarr['query']:'');
$jsonData = '';
// 2.头部签名
$str = "POST"."\n".$url."\n".$time."\n".$noncestr."\n".$jsonData."\n";
$signHead = getSign($str);
$token = sprintf('mchid="%s",serial_no="%s",nonce_str="%s",timestamp="%d",signature="%s"',$mchid,$xlid,$noncestr,$time,$signHead);
$header = array(
'Content-Type:application/json; charset=UTF-8',
'Accept:application/json',
'User-Agent:*/*',
'Authorization:WECHATPAY2-SHA256-RSA2048 '.$token
);
// 3.提交请求
$res = httpRequest($apiurl,$jsonData,$header);
echo json_decode($res,true);
// 4.涉及方法
// http请求
function httpRequest($url='',$data='',$header='')
{
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在,如果出错则修改为0,默认为1
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
if(!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
}
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
if(!empty($header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);//$header以array格式
}
$response = curl_exec($curl); // 执行操作
if (curl_errno($curl)){
echo 'Error:'.curl_error($curl);//捕抓异常
}
curl_close($curl); // 关闭CURL会话
return $response; // 返回数据,json格式
}
// 生成签名
function getSign($content)
{
$binary_signature = "";
$privateKey = file_get_contents($apiclient_key);
$algo = "SHA256";
openssl_sign($content, $binary_signature, $privateKey, $algo);
return base64_encode($binary_signature);
}
参考:
微信开发 ━━ 微信商户v3微信小程序支付方式开发之php篇
无语…
此文章质量较低,篇幅太短,广告涉嫌违规,外链过多,缺少代码,图片涉嫌违规。
官方指南之签名
官方国际版签名
官方开发文档境内之查询订单
JSAPI-JSSDK-小程序接入方式对比