最近公司在开发未支付,刚刚做出测试成功,腾讯平台的技术支持实在不敢恭维,死活联系不上,在测试过程中走了不少弯路,希望大家别像我一样走弯路。
微支付官网下载文档地址:http://download.csdn.net/detail/ethan19/7193855,
主要介绍JS API支付:
支付过程中,最主要的是数据处理,
首先,在Wxpayhelper.php中会处理各种你要使用的参数,比如out_trade_no,appid,partner,body等,
自此形成$msg信息(,貌似是json),
因为微信正式使用还需要测通其他接口(发货,告警,维权,还有一个隐形接口--订单查询)
暂时先写出发货,订单查询的接口
在所有接口我们要做的第一步就是获取access_token值
首先获取订单接口
详细参数可以看下载的接口文档
//发货接口
微支付官网下载文档地址:http://download.csdn.net/detail/ethan19/7193855,
主要介绍JS API支付:
支付过程中,最主要的是数据处理,
首先,在Wxpayhelper.php中会处理各种你要使用的参数,比如out_trade_no,appid,partner,body等,
$this->load->library('Wxpayhelper');
$this->wxpayhelper->setParameter("bank_type", "WX");
$this->wxpayhelper->setParameter("body", "麦当劳");
$this->wxpayhelper->setParameter("partner", $partner);
$this->wxpayhelper->setParameter("out_trade_no", "NB12253018");
$this->wxpayhelper->setParameter("total_fee", "1");
$this->wxpayhelper->setParameter("fee_type", "1");
$this->wxpayhelper->setParameter("notify_url", $url);
$this->wxpayhelper->setParameter("spbill_create_ip", "127.0.0.1");
$this->wxpayhelper->setParameter("input_charset", "UTF-8");
$msg=$this->wxpayhelper->create_biz_package();
自此形成$msg信息(,貌似是json),
然后下载一个JS API支付的事例代码,官网上有(https://mp.weixin.qq.com/htmledition/res/bussiness-course2/wxm-pay-api-demo.zip),可以看到一下js代码,运行代码,可以看到支付成功
<script language="javascript">
// 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
//公众号支付
jQuery('a#getBrandWCPayRequest').click(function(e){
WeixinJSBridge.invoke('getBrandWCPayRequest',<?= $msg?>,function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
// window.location.href="http://www.wepower365.com/order.php/order/re_pay";
}else{
//alert(11111111);
}
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
//因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
});
});
WeixinJSBridge.log('yo~ ready.');
}, false)
</script>
因为微信正式使用还需要测通其他接口(发货,告警,维权,还有一个隐形接口--订单查询)
暂时先写出发货,订单查询的接口
在所有接口我们要做的第一步就是获取access_token值
function getAccessToken($appid, $appsecret) {
$ch = curl_init();
@curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret‘);
@curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
@curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
@curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
@curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
//@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return $tmpInfo;
}
首先获取订单接口
详细参数可以看下载的接口文档
public function check_good(){
$access_token= $this->getAccessToken();
$reponse_array = json_decode($access_token);
$access_token= $reponse_array->access_token;
$sign = $this->getSign("out_trade_no","partner","PaySignKey");
$app_signature = $this->getAppsignature("appid","PaySignKey","out_trade_no=NA1398414173343&partner=partner&sign=".$sign."","1397177957");
$data='{"appid" : "appid","package" : "out_trade_no=NA1398414173343&partner=partner&sign='.$sign.'","timestamp" : "1397177957","app_signature" : "'.$app_signature.'","sign_method" : "sha1"}';
//echo $data;exit;
$result = $this->getContent($access_token,'orderquery',$data);
$result_array = json_decode($result);
print_r($result_array);exit;
}
private function getAppsignature($appid,$appkey,$package,$timestamp){
$array=array("appid"=>$appid,"appkey"=>$appkey,"package"=>$package,"timestamp"=>$timestamp);
$array = $this->formatBizQueryParaMap($array, false);
return sha1($array);
}
private function formatBizQueryParaMap($paraMap, $urlencode){
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v){
// if (null != $v && "null" != $v && "sign" != $k) {
if($urlencode){
$v = urlencode($v);
}
$buff .= strtolower($k) . "=" . $v . "&";
//}
}
$reqPar;
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
private function getSign($number,$partner,$key){
$content = "out_trade_no=".$number."&partner=".$partner."&key=".$key;
$sign = strtoupper(md5($content));
return $sign;
}
private function getContent($access_token,$way,$data){
$ch = curl_init();
@curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/pay/'.$way.'?access_token='.$access_token);
@curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
@curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
@curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
@curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return $tmpInfo;
}
//发货接口
function deliver(){
$access_token= $this->getAccessToken();
$reponse_array = json_decode($access_token);
$access_token= $reponse_array->access_token;
$app_signature = $this->getAppsignature_d("appid","PaySignKey","ojggLjxMcdt9nAhO0dvNFr5vLIHE","1218347401201404133192821670","NB4321000","1397400108","1","ok");
$data = '{"appid":"appid","openid":"ojggLjxMcdt9nAhO0dvNFr5vLIHE","transid":"1218347401201404133192821670","out_trade_no":"NB4321000","deliver_timestamp":"1397400108","deliver_status":"1","deliver_msg":"ok","app_signature":"'.$app_signature.'","sign_method" : "sha1"}';
//var_dump($data);die;
///"appid",
//"openid",用户名
//"transid"交易单号
//"out_trade_no"第三方订单号
//""deliver_timestamp""linux时间戳
//"deliver_status"发货状态,1成功,0失败
//"deliver_msg"一般ok,发货信息
//"app_signature"签名
//"sign_method",,"sha1"加密方式
//app_signature签名生产方式
//appid、appkey、openid、transid、out_trade_no、deliver_timestamp、deliver_status、deliver_msg;
//注意点,时间保持一致,入库时间要和获取app_signature的时间保持一致
$result = $this->getContent($access_token,'delivernotify',$data);
$result_array = json_decode($result);
var_dump($result_array);die;
}
public function getAppsignature_d($appid,$appkey,$openid,$transid,$out_trade_no,$deliver_timestamp,$deliver_status,$deliver_msg){
$array=array("appid"=>"appid","appkey"=>$appkey,"openid"=>$openid,"transid"=>$transid,"out_trade_no"=>$out_trade_no,"deliver_timestamp"=>"1397400108","deliver_status"=>$deliver_status,"deliver_msg"=>$deliver_msg);
$array = $this->formatBizQueryParaMap($array, false);
return sha1($array);
}
在拼接app_signature时经常或报49004的错误,这个是因为app_signature拼接错误的原因,可能是个时间戳错了,也可能是个商品单号错了,仔细检查一下