宝哥软件园

微信支付PHP SDK微信微信官方账号支付代码详解

编辑:宝哥软件园 来源:互联网 时间:2021-09-20

这里假设你已经申请了微信支付。

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 Li style=' background-color : # 698 b22 ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'example/micro pay . PHP ';'用信用卡付款/a/Li Li style=' background-color : # 8b 6914 ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'example/native . PHP ';'代码付款/a/Li listyle=' background-color : # cdcd 00 ' a href='?php回声' http://'。$_SERVER['HTTP_HOST']。$_SERVER['REQUEST_URI']'示例/order query . PHP ';'订单查询/a/Li listyle=' background-color : # CD 3278 ' 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 : # 8ee 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文件中定义的。

函数get OpenID () {//get openid if通过代码(!isset($ _ get[' code ']){//触发微信返回code $ baseurl=urlncode ('http://'。$ _服务器['http _ host']。$ _服务器['PHP _ self']。$ _服务器['query _ string']。$ URL=$ this-_ _ createoauthurforcode($ baseURl);标头(' location : $ URL ');exit();} else {//获取代码以获取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 f0b 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://付费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);跟踪函数通知文件WxPay。Api.php

公共静态函数notify ($ callback,$ msg){//获取notify $ 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($ Needsign=true){//如果需要签名If($ Needsign==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是test这是attach,也就是空格转换成加号。

打印接收到的签名与程序计算的签名不同,意味着接收结果异常。

所以如果我们想使用值attach,我们不能有空格,或者我们根本不使用这个参数。

(等待微信修复这个bug,也许我这边有什么东西不会呢?- -#)

这样就大致分析完成了微信支付的JsApi支付。

更多资讯
游戏推荐
更多+