手机版

PHP实现微信支付(jsapi支付)步骤详解

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

最近接触到一个涉及微信支付的项目。开发微信这么久没付款了,之前也在微信官方账号发红包。感谢前辈们的探索,看了他们的博文,让我少走了很多弯路。

准备工作:

1.微信认证服务号,并开通微信支付

2.微信支付SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?章节=11_1

3.登录微信支付平台https://pay.weixin.qq.com/index.php/account/api_cert下载支付凭证

方法步骤:

1 .演示文件处理

(1)下载文件名为WxpayAPI_php_v3的官方演示,为了方便以后写目录,将这个文件重命名为wxpay

(2)打开lib文件夹下的WxPay.Api.php文件,第537行有一个curl网络请求配置代码:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格检查并替换为:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格验证禁止cURL验证对等方的证书。

(3)打开lib文件夹下的WxPay.Config.php文件,从第25行开始,根据自己的账号完成基本信息设置;

Const APPID='公共帐户app id ';Const MCHID='商户编号';Const KEY='商户支付密钥';Const APPSECRET='公共帐户机密';(4)打开lib文件夹中的WxPay.Notify.php文件,代码在第79行:

if($ needSign==true $ this-GetReturn _ code($ return _ code)=' SUCCESS '){ $ this-SetSign();}阅读:

if($ needSign==true $ this-GetReturn _ code()==' SUCCESS '){ $ this-SetSign();} (5)打开证书证书目录,用自己的支付证书替换其中的两个证书。

2.微信官方账号后台设置

(1)配置网页授权域名,我的域名是(xy . chuyin . ren);

(1)配置支付授权目录。域名为(xy.chuyin.ren)。我把demo放在这个域名指向的目录的weixinopen/文件夹里。演示中的jsapi.php文件位于示例/目录中,因此支付授权目录是xy.chuyin.ren/weixinopen/wxpay/example/

3.支付过程

在示例目录中打开jsapi.php文件,并在此启动和处理付款。

(1)获取用户openid

我之前配置了自己的APPID和APPSecert,所以不需要在这里处理。

//获取用户OpenID $ tools=new JsApiPay();$ OpenID=$ tools-GetOpenID();这里,一个初始化的JsApiPay()类获得一个对象,该文件对应于示例/目录中的WxPay.JsApiPay.php。如果调用GetOpenid(),会自动得到自己的Openid。

(2)统一下单

//.统一订单$ input=new wxpayunifieorder();$ input-SetBody(' test ');$ input-SetAttach(' test ');$ input-SetOut _ trade _ no(wxpayconfig : mcid . date(' 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 . weixin . QQ.com/example/Notify . PHP ');$ input-setrade _ type(' JSAPI ');$ input-SetPunid($ OpenID);$ order=wxpayapi :3360 unified order($ input);Echo 'font color='#f00 '统一支付订单信息/font br/';printf _ info($ order);$ jsApiParameters=$ tools-GetJsApiParameters($ order);对应WxPay.Api.php第24行的unifiedOrder()方法,配置订单信息和支付回拨功能,这里需要修改几个参数:

A.商品名称:

$ input-SetBody(' test ');b .订单号

$ input-SetOut _ trade _ no(wxpayconfig : mcid . date(' YmdHis '));已付金额

$ input-SetTotal _ fee(' 1 ');d .付款验证链接

将其设置为notify.php文件的位置,因此我将其设置为:http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php

你也可以写其他地址,当然是在支付授权域名下。支付成功后,会自动回调到链接指定的方法,在这里可以进行判断和数据库操作。

$ input-SetNotify _ URL(http://pay SDK . weixin . QQ.com/example/Notify . PHP);e .其他参数

$ input-SetAttach(' test ');可以填充或不填充附加参数。如果已填充,字符串中最好不要有空格。

这时,点击支付应该可以支付成功。

(3)发起支付

脚本类型='text/javascript' //call微信JS api支付函数jsa picall(){ weixinsbridge . invoke(' getbrandwcpayrequest ',php echo $ jsApiParameters?function(RES){ weixinsbridge . log(RES . err _ msg);alert(RES . err _ code RES . err _ desc RES . err _ msg);} );}函数callpay() { if(类型为weixinsbridge==' undefined '){ if(document . addeventlistener){ document . addeventlistener(' weixinsbridgeready ',jsApiCall,false);} else if(document . attachevent){ document . attachevent(' weixinsbridgeready ',jsApiCall);document . attachevent(' onweixinsbridgeready ',jsApiCall);} } else { JSapiCall();}} /script点击立即支付按钮调用callpay()函数,他有时会调用jsApiCall()函数打开支付程序。

函数监听每个动作:

Res.err_msg为get _ brand _ wcpay _ request 3360 cancel,表示前端判断取消支付,es.err_msg为get _ brand _ get _ brand _ wcpay _ request : ok,表示前端判断使支付成功。我们可以根据这个跳转到成功页面。

(4)支持成功回拨

支付结果可以通过前端jsApiCall()函数进行监控,但这是不可信的。确认支付是否成功,或者业务逻辑是否要通过notify.php处理。前面配置了支付验证链接SetNotiFication _ URL()。支付完成后,微信服务器会根据链接自动请求你的notify.php文件并打开这个文件。事实上,这个文件的主要代码是两行:

$ notify=new PayNotifyCallBack();$ notify-Handle(false);这将跟踪WxPay.Notify.php类文件的Handle()函数:

/* * * *//当返回false时,表示NotifyCallBack的调用在notify中失败,签名验证失败。此时,直接回复失败$ result=wxpayapi :3360 notify(array($ this,' notifycallback '),$ msg);if($ result==false){ $ this-SetReturn _ code(' FAIL ');$ this-SetReturn _ msg($ msg);$ this-ReplyNotify(false);返回;} else {//分支成功回调NotifyCallBack方法,进程$this-SetReturn_code('SUCCESS ')完成;$ this-SetReturn _ msg(' OK ');} $ this-ReplyNotify($ NeedSign);}主代码:

$ result=wxpayapi : notify(array($ this,' NotifyCallBack '),$ msg);然后来到WxPay.Api.php文件的第411行,通知()功能:

/* * * *支付结果的一般通知* @param函数$回调*直接回调函数使用方法: notify(you _ function);*回调类成员函数方法: notify (array ($ this,you _ function));* $callback原型为:function _ name($ data){ } */public static function notify($ callback,$ msg){//get notification data $ XML=$ globals[' http _ raw _ post _ data '];//file_put_contents('log.txt ',$xml,FILE _ APPEND);//如果成功返回,验证签名try { $ result=wxpayresults 33603360 init($ XML);} catch(WxPayException $ e){ $ msg=$ e-error message();返回false} return call _ user _ func($ callback,$ result);} $ xml=$ globals[' http _ raw _ post _ data ']是用户在支付成功后返回给您的结果,是XML格式的字符串。

我们可以在这里记录返回的xml数据,然后打开它看到$out_trade_no是我自己在付款前设置的订单号,$attach是额外设置的参数。

我得到了这个订单号,然后我直接在下面写了支付成功后的逻辑,比如更改数据库中的数据等等。

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

这是通过集成官方的SDK实现的。如果不使用SDK,可以使用更简单的方法。见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)

摘要

以上是边肖介绍的用PHP实现微信支付(jsapi payment)的步骤的详细说明,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:PHP实现微信支付(jsapi支付)步骤详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。