经过了几天的痛苦煎熬,终于把微信支付调通,整个调试过程很痛苦,痛苦的主要来源是微信支付的调试真的是,以前调试公众号支付也是一波三折啊。好吧,开始!首先说明,我这里主要没有使用getToken,getOrder方法,我的所有参数全部是在后端生成传递给前端的,看了一下前面朋友分享的源代码,还用到了jquery,md5,sha对于新手来说简直是天文啊,而且jquery在apicloud中效率不好,所以放弃了研究那个代码,另外官方也说了,最好签名等参数全部服务器端生成,微信也是这么说的。
注意:微信本身在apicloud中config.xml文件你要先弄好
先看一下APP端的代码
function wx_pay() { api.ajax( { url : serverURL+"weixin/example/app.php", method : 'POST', timeout : '30', dataType : 'json', returnAll : false, cache :true, data: { values:{type:"login"} } }, function(ret, err) { if (ret) { var back_info=ret; var weiXin = api.require('weiXin'); weiXin.registerApp ( function(ret,err) { if (ret.status) { weiXin.payOrder( { orderId:back_info.prepayid, partnerId:back_info.partnerid, nonceStr:back_info.noncestr, timeStamp:back_info.timestamp, package:back_info.package, sign:back_info.sign },function(ret,err) { if (ret.status) { $alert('支付成功'); } else { $alert(err.msg); } }); } else { $alert(err.msg); } } ); } else { $alert(json2str(err)); } }); }
完全按照apicloud写的,没有任何问题,大家可以直接复制过去用,其中的$alert是我自己封装的方法,就是弹出信息而已
下面主要是服务端,见附件 ,下载
这个是从微信官方下载下来的,坑爹的微信给的事例太垃圾了,说明也不细致,统一下单的接口生成有了,但是app数据的生成没有,只有js的生成,只能自己写了,其中的签名,随机字符串,还有时间戳等等,每次请求,生产都要重新来一遍,更加可恶的一件事情是,竟然大小写不一致,我本以为直接将js的稍微修改修改就好了,结果不行,死活找不到原因,后来仔细对照文档看了一下,js调起支付的很多参数是有大小写的,但是app调起是全部小写的,具体文档见下方:
- JS:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7
- APP:https://pay.weixin.qq.com/wiki/d ... hapter=9_12&index=2
你们也可以仔细对比,不埋怨了,看代码吧。
首先打开example/app.php,这个是我写的接口文件
SetBody("test1");//商品或支付单简要描述(必须填写) //$input->SetAttach("test2");//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据(不必填) //$input->SetDetail("Ipad mini 16G 白色,黑色");//商品名称明细列表(不必填) $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));//订单号(必须填写) $input->SetTotal_fee("1");//订单金额(必须填写) //$input->SetTime_start(date("YmdHis"));//交易起始时间(不必填) //$input->SetTime_expire(date("YmdHis",time()+600));//交易结束时间10分钟之内不必填) $input->SetGoods_tag("test");//商品标记(不必填) $input->SetNotify_url("http://tc.weixinxa.com/app/weixin/example/****.php");//回调URL(必须填写) $input->SetTrade_type("APP");//交易类型(必须填写) //$input->SetProduct_id("123456789");//rade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。 $order = WxPayApi::unifiedOrder($input);//获得订单的基本信息,包括prepayid $appApiParameters = $notify->GetAppApiParameters($order);//生成提交给app的一些参数 die($appApiParameters); ?>
以上回调URL一定要写好,我这个附件中还没有做回调的处理,之后会有更新。
注意几点:
1.交易类型必须是APP,如果你是申请的微信公众号的支付,而不是从https://open.weixin.qq.com/这里申请的,就用不成
2.第一步是生成order,返回的是一个数组,保证这个数组里面要有prepay_id,如果没有,那你就要检查配置文件了lib/WxPay.Config.php
继续看代码
example/WxPay.AppPay.php
$v) { $buff .= $k . "=" . $v . "&"; } $buff = trim($buff, "&"); return $buff; } /** * * 生成直接支付url,支付url有效期为2小时,模式二 * @param UnifiedOrderInput $input */ public function GetPayPrepayId($input) { if($input->GetTrade_type()=="APP") { $result = WxPayApi::unifiedOrder($input); return $result; } } /*生成APP提交数据*/ public function GetAppApiParameters($UnifiedOrderResult) { if(!array_key_exists("appid", $UnifiedOrderResult) || !array_key_exists("prepay_id", $UnifiedOrderResult) || $UnifiedOrderResult['prepay_id'] == "") { throw new WxPayException("参数错误"); } $appapi = new WxPayAppApiPay(); $appapi->SetAppid($UnifiedOrderResult["appid"]); $appapi->SetPartnerId($UnifiedOrderResult["mch_id"]); $appapi->SetPrepayId($UnifiedOrderResult["prepay_id"]); $timeStamp = time(); $appapi->SetTimeStamp($timeStamp); $appapi->SetNonceStr(WxPayApi::getNonceStr()); $appapi->SetPackage("Sign=WXPay"); $appapi->SetSign($appapi->MakeSign()); $back_arr=$appapi->GetValues(); $back_arr['prepay_id']=$UnifiedOrderResult["prepay_id"]; $parameters = json_encode($appapi->GetValues()); return $parameters; } }
这个文件不是官方提供的,是我自己写的,仿照WxPay.NativePay.php这个文件写的,主要看42行GetAppApiParameters这个函数。由此生成了app提交的很多基础数据,在这个文件中又引用了一个类WxPayAppApiPay,在lib/WxPay.Data.php中,最后一个函数,现在我们来看一下配置文件吧/lib/WxPay.Config.php
主要是修改
- const APPID = 'wxd3ae8cc5ab312345';
- const MCHID = '1250189001';
- const KEY = '14e1b600b1fd579f47433b88e8d85111';
- const APPSECRET = 'e43930e9e262176356adbf1101e11111';
其他的不要动就行了
就这么多了,我现在继续写回调处理的url,写好了继续上吧
相信很多人都遇到了问题,不然怎么可能在论坛里面搜索微信支付没有一个可以实际解决问题的呢。
增加了回调,看代码,把以下代码覆盖到/lib/example/notify.php这个文件就可以了
SetTransaction_id($transaction_id); $result = WxPayApi::orderQuery($input); Log::DEBUG("query:" . json_encode($result)); if(array_key_exists("return_code", $result) && array_key_exists("result_code", $result) && $result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") { $out_trade_no=$result['out_trade_no'];//私有订单号,你就用这个订单号来进行你自己订单的各种更新吧 $mch_id=$result['mch_id'];//商户号 $total_fee=$result['total_fee'];//支付金额,出来的金额要除以100 $transaction_id=$result['transaction_id'];//微信内部的订单流水号 $openid=$result['openid'];//微信加密的用户身份识别,app支付的话其实意义不大了 /*以下两行用做调试,会自动生成in_test.txt文件而且后期内容会自动追加到这个文件*/ $fp = fopen('in_test.txt','a+'); fwrite($fp,date("Y-m-d H:i:s").json_encode($result) . "|".$transaction_id." 成功了!rn"); /**/ return true;//这个很重要,微信的异步请求,当你执行完了你的内部处理以后给他返回true,微信就认为你的内部处理完成了,就不会再次请求你了,否则他会一直请求你这个文件,知道超时。 } return false; } //重写回调处理函数 public function NotifyProcess($data, &$msg) { Log::DEBUG("call back:" . json_encode($data)); $notfiyOutput = array(); if(!array_key_exists("transaction_id", $data)){ $msg = "输入参数不正确"; return false; } //查询订单,判断订单真实性 if(!$this->Queryorder($data["transaction_id"])){ $msg = "订单查询失败"; return false; } return true; } } Log::DEBUG("begin notify"); $notify = new PayNotifyCallBack(); $notify->Handle(false);
以上就是本文的全部内容,希望对大家的学习有所帮助。