微信支付PHP SDK ——微信官方账号支付码详解
在微信支付开发者文档页面下载最新的php SDK
http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?章节=11_1
这里假设你已经申请了微信支付
1.微信后台配置如图
我们先测试,所以先添加测试授权目录和测试白名单。测试授权目录是你要发起微信请求的目录。
比如jsapi发起的请求是jsapi.php所在的目录是测试目录,测试白名单是开发者的微信号。
官方支付授权目录不能与测试目录相同,否则会报错。如果没有填写或填写错误的授权目录和测试白名单,就会报错。
错误报告示例:
NaNsystem:access访问被拒绝
不再测试白名单
2.配置lib/WxPay。Config.php档案
主要配置有四项:
const APPID=const MCHID=const KEY=const APPSECRET=
APPID和APPSECRET都可以在微信后台找到。申请微信支付后发送的邮件中可以找到MCHID,根据邮件提示KEY
去商家平台进行配置。
3.访问从index.php开始
首先参观index.php,你可以看到界面
我们首先需要的是JSAPI支付。但是看看代码index.php底部的链接。默认情况下,他是一个演示链接,我们可以将其更改为自己的链接
ul Li style=' background-color : # ff7f 24 ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'示例/jsapi . PHP ';'通过JSAPI/a/Li listyle=' background-color : # 698 b22 ' a href='付款?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'example/micro pay . PHP ';'用信用卡付款/a/Li Li style=' background-color 3360 # 8b 6914 ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'example/native . PHP ';'扫码支付/a/Li Li style=' background-color : # cdcd 00 ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'示例/order query . PHP ';'订单查询/a/Li Li风格='背景色: # cd3278' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'示例/退款. PHP ';'订单退款/a/Li listyle=' background-color : # 848484 ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'example/refundquery . PHP ';'退款查询/a/Li listyle=' background-color : # 8e 5ee ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'示例/download . PHP ';'下载订单/a/li/ul
当然也可以直接写自己的访问链接。
4.JSAPI支付
所需的代码分辨率:
$logHandler=new CLogFileHandler('./log/'。日期(' Y-m-d ')。log’);$ log=log : init($ log handler,15);
调用日志类可以通过$ log-debug(' test ');打印调试信息。其实也可以直接使用$ $ log: debug(‘test’);调试
$ tools=new JSapiPay();$ OpenID=$ tools-GetOpenID();
主要是获取openid,其中GetOpenid()函数是在文件WxPay.JsApiPay.php文件中定义的
公共函数GetOpenid() {//如果通过代码(!isset($ _ get[' code ']){//触发微信返回code $ baseurl=urlncode ('http://'。$ _服务器['http _ host']。$ _服务器['PHP _ self']。$ _服务器['query _ string']。$ URL=$ this-_ _ createoauthurforcode($ baseURl);标头(' location : $ URL ');exit();} else {//get code获取open id $ code=$ _ GET[' code '];$ OpenID=$ this-getOpenidFromMp($ code);返回$ openid} }$baseUrl实际上是跳回这个页面。可以继续跟踪函数_ _ _ CreateOauthUrlForCode(),实际上是通过微信的Auth2.0获取Openid引用链接:http://MP . weixin . QQ.com/wiki/17/c0f 37d 5704 f 0 b 64713 D5 d2c 37 b 468d 75 . html。
这需要你设置微信的网页授权界面。
获取到Openid就可以调用微信支付的统一下单接口了。回到文件jsapi.php如下代码$ input=new wxpayunifieorder();$ input-SetBody(' test ');$ input-SetAttach(' test ');$ input-Setout _ trade _ no(wxpayconfig : mcid。日期(' YmdHis ');$ input-SetTotal _ fee(' 1 ');$ input-SetTime _ start(date(' YmdHis '));$ input-SetTime _ expire(date(' YmdHis ',time()600));$ input-SetGoods _ tag(' test ');$ input-SetNotify _ URL(' http://pay SDK。微信。QQ。com/示例/Notify。PHP’);$ input-set rade _ type(' JSAPI ');$ input-SetUnid($ OpenID);$ order=wxpayapi :3360统一订单($ input);echo 'font color='#f00 '统一下单支付单信息/font br/';printf _ info($ order);$ jsApiParameters=$ tools-GetJsApiParameters($ order);这里面的代码:
$ input-SetAttach(' test ');
如果把值改为$input-SetAttach('test这是附加');就会存在病菌后面再说,其实这个参数不是必须的干脆可以去掉。代码:
$ input-SetNotify _ URL(' http://pay SDK。微信。QQ。com/示例/Notify。PHP’);
是设置接收支付结果通知的全球资源定位器(统一资源定位符)这里是默认的演示链接我们可以设置成我们的:
$ input-SetNotify _ URL(目录名(' http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])./notify。PHP’);
当然你也可以选择直接写死。
其中的函数统一订单(投入)可以到WxPay。Api.php中文件跟踪,其实就是调用统一下单接口。
在WxPay。Api.php中需要更改的一处代码是:
//异步通知全球资源定位器(统一资源定位符)未设置,则使用配置文件中的url if(!$ input bj-IsNotify _ urlSet()){ $ input bj-set notify _ URL(wxpayconfig : notify _ URL);//异步通知url }就是当没设置notifyUrl的时候回去配置文件中找,但是配置文件中根本没有设置。
所以你可以选择在配置文件WxPay。Config.php中加上这个配置,也可以直接写一个默认的通知链接。
函数GetJsApiParameters()是获取jsApi支付的参数给变量$jsApiParameters方便在下面的射流研究…中调用
jsapi.php中射流研究…的代码:
函数jsApiCall(){ weixinsbridge。调用(' getBrandWCPayRequest ',php echo $ jsApiParameters?函数(RES){ weixinsbridge。日志(RES . err _ msg);警报(错误代码错误desc错误消息);} );}函数callpay() { if(类型为weixin bridge==' undefined '){ if(document。addeventlistener){ document。addeventlistener(' weixinsbridgeready ',jsApiCall,false);} else if(文档。attachevent){ document。attach event(' weixinsbridgeready ',JSapicall);文件。attach event(' on weixinsbridgeready ',JSapicall);} } else { JSapiCall();} }其中点击立即支付按钮调用的就是callpay()函数,他有会调用jsApiCall()函数打开支付程序。此后输入密码完成支付。
在完成支付页面点击完成会回到这个支付页面,并弹出支付成功的提示框
这个其实就是射流研究…函数jsApiCall里面的改变弹出的对话框
其中res.err_msg为get_brand_wcpay_request:ok表明前端判断的支付成功,我们可以根据这个将支付跳转到成功页面。
但是这个并不可信。确认是否支付成功还是应当通过notify.php处理业务逻辑。
5.支付结果通知notify.php
其实这个页面最主要的代码就两行
$ notify=new PayNotifyCallBack();$ notify-Handle(false);
其中大部分逻辑在处理函数中处理文件WxPay .Notify.php
最终公共函数句柄($ NeedSign=true){ $ msg=' OK ';//当返回错误的的时候,表示通知中调用通知回调回调失败获取签名校验失败,此时直接回复失败$ result=wxpayapi : notify(array($ this,' NotifyCallBack '),$ msg);if($ result==false){ $ this-SetReturn _ code(' FAIL ');$ this-SetReturn _ msg($ msg);$ this-ReplyNotify(false);返回;} else { //该分支在成功回调到通知回调方法,处理完成之后流程$ this-SetReturn _ code(' SUCCESS ');$ this-SetReturn _ msg(' OK ');} $ this-ReplyNotify($ NeedSign);}主要代码:
$ result=wxpayapi : notify(array($ this,' NotifyCallBack '),$ msg);//跟踪函数notify文件wxpay.api.php公共静态函数notify ($ callback,$ msg){//获取通知数据$ XML=$ globals[' http _ raw _ post _ data '];//如果成功返回,验证签名try { $ result=wxpayresults 33603360 init($ XML);} catch(WxPayException $ e){ $ msg=$ e-error message();返回false} return call _ user _ func($ callback,$ result);}传递了$ globals[' http _ raw _ post _ data '];获取gay数据,然后Init函数验证签名。成功运行代码return call _ user _ func ($ callback,$ result);
也就是说,当回调函数被调用时,NotifyCallBack()函数和参数$result被传递,我们重写的NotifyProcess()函数将在NotifyCallBack函数中被调用(这个函数在notify.php中被重写)
NotifyProcess()将设置xml信息,如果判断没有问题,则返回成功。
$ this-SetReturn _ code(' SUCCESS ');$ this-SetReturn _ msg(' OK ');
最后调用函数$ this-ReplyNotify($ needSign);回声成功的结果
函数ReplyNotify需要修改一个代码:
最终私有函数回复notify($ need sign=true){//如果需要签名If($ need sign==true $ this-getreturn _ code($ return _ code)=' success '){ $ this-setsign();} wxpayapi :3360 replynotify($ this-ToXml());} $ this-GetReturn _ code($ return _ code)=' SUCCESS ')
代替
$ this-GetReturn _ code()==' SUCCESS ')
动手吧。所以整个过程结束了。上面提到了传递订单参数
$ input-SetAttach(' test ');
如果我设置值来测试这是attach(事实上,只要有空格,就会有bug)
订单信息传输如图所示
可以看到附件信息正常,付款当然正常,没有任何问题。
但是发现总是收到通知通知,也就是说没有将正确的结果通知返回给微信服务器。从服务器打印通知数据
你可以看到,附加是测试这是附加,也就是说,空格被转换成加号
打印接收到的签名和程序计算出的签名,发现签名不一样,即认为接收结果异常。
因此,如果我们想使用值attach,我们不能有空格,或者我们根本不使用这个参数
(等待微信修复这个bug,可能我这边有什么东西不会?- -#)
这样就大致分析完成了微信支付的JsApi支付。
以上是微信支付PHP SDK的支付代码详解,后续继续补充相关信息。感谢您对本网站的支持!
版权声明:微信支付PHP SDK ——微信官方账号支付码详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。