本文举例说明了微信支付与ThinkPHP框架集成的JSAPI模式。分享给大家参考,如下:
目前微信很受欢迎,一系列详细的演示在网上很少见到。所以,花点时间做一系列关于微信支付的教程。
本教程为JSAPI模式支付,其他将继续编写
首先下载微信支付的演示,我们根据微信上的演示整合到TP中。
介绍几个我们在这里需要用到的文档:
在演示文件夹中:
Js_api_call.php:提供微信jsapi log_的主要功能。php:提供打印日志函数notify_url.php:异步通知函数notify_url.log:异步通知日志二维码. js:生成二维码js插件
接下来,介绍WxPayPubHelper文件夹下的文件:
Cacert文件夹是用来存放微信证书的(PS:我还没用证书,虽然下载了,请在微信商家平台下载)SDKRuntimeException.php:这是处理异常,WxPay.pub.config.php:这是做一些配置,WxPay.pub.config.php后面会详细说明:这其实是一个微信支付的工具类。初学者知道如何使用他的方法就足够了。
好了,了解了微信提供的官方文档后,就可以开始融入TP了。废话不多说,我们就开始吧!
步骤1:将演示中的整个文件夹WxPayPubHelper复制到TP的供应商目录,像我一样:
步骤2:配置WxPay.pub.config.php文件:
这里的配置有注释。如果您仍然不理解或有配置问题,可以留言提问
同时,我把微信的这个配置放到了TP的配置里面。这一步对每个人都是免费的
?Phpreturn数组(//'配置项'='配置值' define('WEB_HOST ','这是您的网站域名地址'),/*微信支付配置*/'wxpayconf _ pub'=数组(' appID'='您的appID ',' MCHID'='您的商户id) KEY'='商户秘密',' APPSECRET'='您的app秘密',' js _ API _ call _ URL'=web _ host。/index . PHP/home/wxjsapi/jsa picall ',' SSLCERT_PATH'=WEB_HOST。/ThinkPhp/Library/Vendor/wxpayPubHelper/cacert/API client _ cert . PEM ',' SSLKEY_PATH'=WEB_HOST。/ThinkPhp/Library/Vendor/wxpayPubHelper/cacert/API client _ key . PEM ',' NOTIFY_URL'=WEB_HOST。/index.php/Home/WxJsAPI/notify ',' CURL _ time out '=30));Step3:将生成二维码的js放在Public目录下(这里目前不使用,只在扫码支付时使用),将日志文件放在Public目录下:像我一样;
步骤4:创建控制器:这里已经创建了一个WxJsAPIController的控制器,大家可以随便命名,只要对应你在公共平台上的设置即可(公共平台的设置后面会介绍)
以下是控制器的代码部分。首先,初始化控制器并导入WxPayPubHelper
/* * * initialize */public function _ initialize(){//介绍wxpaypubhelper厂商(' wxpaypubbhelper . wxpaypubbhelper ');}下一步是使用统一支付接口获取predater _ id _ id:
公共函数jsApiCall() { //使用支付插件接口$ JSAPi=new JSAPi _ pub();//=========步骤1:网页授权获取用户OpenID=====================//通过密码获得openid if(!isset($ _ GET[' code ']){//触发微信返回密码码$ URL=$ JSAPI-createoauthurforcode(C(' WxpayConf _ pub .JS _ API _ CALL _ URL’);标头(“位置: $ URL”);}else { //获取密码码,以获取open id $ code=$ _ GET[' code '];$ JSAPi-SetCode($ code);$ OpenID=$ JSAPI-GetOpenID();} //=========步骤2:使用统一支付接口,获取预付费_ id======================//使用统一支付接口$ unified order=new unified order _ pub();//设置统一支付接口参数//设置必填参数//appid已填,商户无需重复填写//mch_id已填,商户无需重复填写//非estr已填,商户无需重复填写//spbill_create_ip已填,商户无需重复填写//符号已填,商户无需重复填写$统一订单集参数(' open id ',$ open id);//商品描述$统一订单集参数(' body ','贡献一分钱');//商品描述//自定义订单号,此处仅作举例$ TiMer=time();$out_trade_no=C('WxPayConf_pub .APPID ').$ TiMer$统一订单集参数(' out _ trade _ no ',$ out _ trade _ no);//商户订单号$ UnifiedOrder-SetParameter(' total _ fee ',' 1 ');//总金额$统一订单集参数(' notify _ URL ',C('WxPayConf_pub .NOTIFY _ URL’);//通知地址$ UnifiedOrder-SetParameter(' trade _ type ',' JSAPI ');//交易类型//非必填参数,商户可根据实际情况选填//$统一订单集参数(' sub _ mch _ id ',' XXXX ');//子商户号//$统一订单集参数(' device _ info ',' XXXX ');//设备号//$统一订单集参数(' attach ',' XXXX ');//附加数据//$统一订单集参数(' time _ start ',' XXXX ');//交易起始时间//$统一订单集参数(' time _ expire ',' XXXX ');//交易结束时间//$统一订单集参数(' goods _ tag ',' XXXX ');//商品标记//$统一订单集参数(' OpenID ',' XXXX ');//用户标识//$统一订单集参数(' product _ id ',' XXXX ');//商品ID $ prevable _ ID=$统一订单-getprevable ID();//=========步骤3:使用支付插件调起支付============$ JSAPi-设置返回id($预付费_ id);$ JSapiParameters=$ JSapi-GetParameters();$this-assign('jsApiParameters ',$ JSapiParameters);$ this-display(' pay ');//echo $ JSapiParameters;}这里都是复制微信演示的,改改名字罢了,没什么其他的
接下来是异步通知方法,也是复制的微信演示上的
公共函数notify() {//使用公共通知接口$ Notify=new Notify _ pub();//Store微信回调$ XML=$ globals[' http _ raw _ post _ data '];$ notify-SaveDATa($ XML);//验证签名并回复微信。//与后台通知交互时,如果微信收到商家未成功或超时的回复,则认为通知失败。//微信会通过一定的策略定期重新发起通知(比如30分钟8次),//尽量提高通知的成功率,但微信不保证通知最终会成功。if($ notify-checkSign()==FALSE){ $ notify-setReturnParameter(' return _ code ',' FAIL ');//返回状态代码$ notify-set Return parameter(' Return _ msg ','签名失败');//返回信息} else { $ notify-set return parameter(' return _ code ',' success ');//设置返回代码} $ return XML=$ notify-return XML();echo $ returnXml//==商家根据实际情况设置相应的处理流程。这里只是一个例子======//以日志文件的形式记录回调信息//$ Log _=new Log _();$log_name=__ROOT__。/Public/notify _ URL . log ';//日志文件路径log_result($log_name,'[通知已收到] :n '。$xml。 n ');if($ notify-check sign()==true){ if($ notify-data[' return _ code ']=' fail '){//这里应该更新订单状态,商家应该添加和删除操作日志_result($log_name,'[通讯错误] : n }否则if($ notify-data[' result _ code ']=' fail '){//这里应该更新订单状态,商家应该添加和删除操作日志_result($log_name,'[业务错误] : n '。$xml。 n ');} else{ //订单状态应该在这里更新,商家可以添加和删除log_result($log_name,'[支付成功] :n '。$xml。 n ');}//商家自行添加处理流程,//比如:更新订单状态//比如:数据库操作//比如:推送支付完成信息}}这里我把日志类写入函数. php:
函数log_result($file,$word){ $fp=fopen($file,' a ');flock($fp,LOCK _ EX);Fwrite($fp,'执行日期:'。str time(' % y-% m-% d-% h:% m:% s ',time())。 n。一个字。 n n ');flock($fp,LOCK _ UN);fc lose(FP美元);}嗯,其实控制器的方法有这么多,没有别的。让我们看一下页面,直接进入代码:
!DOCTYPE html html head meta http-equiv=' content-type ' content=' text/html;Charset=utf-8'/title微信安全支付/title script type=' text/JavaScript '/call微信JS api支付函数jsapicall(){ weixinsbridge . invoke(' getbrandwcpayrequest ',php echo $ jsApiParameters?function(RES){ weixinsbridge . log(RES . err _ msg);alert(RES . err _ code RES . err _ desc RES . err _ msg);//alert(' { $ JSapiParameters } ');} );}函数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/head body/br/br/br/div align=' center ' button style=' width :210 px;高度:30 px;背景色-: # FE6714;border:0px #FE6714固体;cursor:指针;颜色:白色;' font-size :16 px;'type=' button ' onclick=' callpay()' contribute/button/div/body/html不做任何改动,直接复制就可以了
接下来是微信公众平台的配置。我在这里遇到过问题。如果这里有遇到问题的同学,请留言,比如access _ deactivated或者access _ deined allowed,可能是这里配置不正确。请查看配置过程的截图:
单击修改进入配置:
好的,你可以测试一下:这是我的测试截图:
用微信扫描二维码
点击微信贡献支付页面:
截至目前,微信JSAPI支付功能已经完成
当然,如果是第一次做,肯定会遇到各种各样的问题。如果你是新手,你不知道为什么会遇到问题。如果你及时做了,我相信细节上的疏忽可能还是有问题的。但不要沮丧,耐心地发现问题。请留言。下面还会介绍微信扫码支付模式1和模式2的详细教程。
微信支付教程扫码方式1://www . JB 51 . net/article/159356 . htm
微信支付教程扫码方式2://www . JB 51 . net/article/159362 . htm
微信支付教程刷卡支付://www . JB 51 . net/article/159401 . htm
更多对thinkPHP感兴趣的读者可以查看本网站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》、《PHP模板技术总结》、0103010。
希望本文对基于ThinkPHP框架的PHP编程有所帮助。