摘要:本文将带你了解微信开发Thinkphp3.2整合微信支付,希望本文对大家学微信有所帮助。
本文将带你了解微信开发Thinkphp3.2整合微信支付,希望本文对大家学微信有所帮助。
业务场景:
用户在网页上选定商品,然后生成QRcode,用户扫后付款返回信息给server。
用到的支付模式:
NATIVE模式二
服务端信息:
PHP,Thinkphp3.2框架
1.文件整合
首先把官方提供的demo下下来:
下下来以后 把demo里面的WxPayPubHelper整个文件夹放到Thinkphp项目里面Vendor文件夹中,放置之后项目就可以通过Vendor(""WxPayPubHelper.文件名"")来调用里面的php文件(.php不需要加)
2.代码整合
模式二主要用到的是wxpay文件夹里面的native_dynamic_qrcode.php,notify_url.php和qrcode.js三个。
在配置文件中配置要用到的信息,包括微信号ID、微信号SECRET、商户ID、商户支付秘钥、证书的url路径、异步通知的URL
要注意的是:异步URL地址必须是PATHINFO模式,如果是参数模式的话会调用不了。同时还要在微信号上微信支付->开发配置->支付配置中填好相同的NOTIFY_URL
然后可以开始写自己的代码了
建一个新的controller(或者整合到你自己的controller里面,在这里我建立一个新的Pay模块里面用IndexController)
public function index(){ Vendor(""WxPayPubHelper.WxPayPubHelper""); //使用统一支付接口 $unifiedOrder = new \UnifiedOrder_pub(); //设置统一支付接口参数 //设置必填参数 //appid已填,商户无需重复填写 //mch_id已填,商户无需重复填写 //noncestr已填,商户无需重复填写 //spbill_create_ip已填,商户无需重复填写 //sign已填,商户无需重复填写 $unifiedOrder->setParameter(""body"",""贡献一分钱"");//商品描述 //自定义订单号,此处仅作举例 $timeStamp = time(); $out_trade_no = C('wxappid').""$timeStamp""; $unifiedOrder->setParameter(""out_trade_no"",""$out_trade_no"");//商户订单号 $unifiedOrder->setParameter(""total_fee"",""1"");//总金额 $unifiedOrder->setParameter(""notify_url"",C('NOTIFY_URL'));//通知地址 //var_dump(urlencode(C('NOTIFY_URL'))); $unifiedOrder->setParameter(""trade_type"",""NATIVE"");//交易类型 //非必填参数,商户可根据实际情况选填 //$unifiedOrder->setParameter(""sub_mch_id"",""XXXX"");//子商户号 //$unifiedOrder->setParameter(""device_info"",""XXXX"");//设备号 //$unifiedOrder->setParameter(""attach"",""XXXX"");//附加数据 //$unifiedOrder->setParameter(""time_start"",""XXXX"");//交易起始时间 //$unifiedOrder->setParameter(""time_expire"",""XXXX"");//交易结束时间 //$unifiedOrder->setParameter(""goods_tag"",""XXXX"");//商品标记 //$unifiedOrder->setParameter(""openid"",""XXXX"");//用户标识 $unifiedOrder->setParameter(""product_id"",""1101"");//商品ID //获取统一支付接口结果 $unifiedOrderResult = $unifiedOrder->getResult(); var_dump($unifiedOrderResult); //商户根据实际情况设置相应的处理流程 if ($unifiedOrderResult[""return_code""] == ""FAIL"") { //商户自行增加处理流程 echo ""通信出错:"".$unifiedOrderResult['return_msg'].""""; } elseif($unifiedOrderResult[""result_code""] == ""FAIL"") { //商户自行增加处理流程 echo ""错误代码:"".$unifiedOrderResult['err_code'].""""; echo ""错误代码描述:"".$unifiedOrderResult['err_code_des'].""""; } elseif($unifiedOrderResult[""code_url""] != NULL) { //从统一支付接口获取到code_url $code_url = $unifiedOrderResult[""code_url""]; //商户自行增加处理流程 //...... $this->assign('code_url',$code_url); } $this->assign(""unifiedOrderResult"",$unifiedOrderResult); $this->theme('default')->display('Pay/index'); }
然后加上以上的代码,代码直接从demo里面抽出来的,主要就是通过Vender读到helper, 然后是前端部分:
订单号:
"" type=""hidden"">查询订单状态
"" type=""hidden"">
申请退款
返回首页
JS生成QR部分也是用demo的代码,主要就是督导qrcode.js然后接受到服务端返回的信息把QRcode生成出来,其他查询订单和退款功能这里不做演示了。
到这里就可以用http//你的网址/index.php/pay/index/index 访问看到你的支付QRcode了
当然还没结束,用户支付成功后要获取到微信服务端的异步通知信息,在IndexController中加入一个notify方法:
public function notify(){ //include_once(""./log_.php""); //echo 'access'; Vendor(""WxPayPubHelper.WxPayPubHelper""); //使用通用通知接口 $notify = new \Notify_pub(); //存储微信的回调 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $notify->saveData($xml); //验证签名,并回应微信。 //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败, //微信会通过一定的策略(如30分钟共8次)定期重新发起通知, //尽可能提高通知的成功率,但微信不保证通知最终能成功。 // $this->log_result(""【checkSign】:\n"".$notify->checkSign().""\n""); if($notify->checkSign() == FALSE){ $notify->setReturnParameter(""return_code"",""FAIL"");//返回状态码 $notify->setReturnParameter(""return_msg"",""签名失败"");//返回信息 }else{ $notify->setReturnParameter(""return_code"",""SUCCESS"");//设置返回码 } $returnXml = $notify->returnXml(); echo $returnXml; // $this->log_result(""【返回回调信息】:\n"".$returnXml.""\n""); //==商户根据实际情况设置相应的处理流程,此处仅作举例======= //以log文件形式记录回调信息 $this->log_result(""【接收到的notify通知】:\n"".$xml.""\n""); if($notify->checkSign() == TRUE) { if ($notify->data[""return_code""] == ""FAIL"") { //此处应该更新一下订单状态,商户自行增删操作 $this->log_result(""【通信出错】:\n"".$xml.""\n""); } elseif($notify->data[""result_code""] == ""FAIL""){ //此处应该更新一下订单状态,商户自行增删操作 $this->log_result(""【业务出错】:\n"".$xml.""\n""); } else{ //此处应该更新一下订单状态,商户自行增删操作 $this->log_result(""【支付成功】:\n"".$xml.""\n""); } //商户自行增加处理流程, //例如:更新订单状态 //例如:数据库操作 //例如:推送支付完成信息 } }
确认 //你的网址/index.php/pay/index/notify 可以访问到,这个地址就是前面提及到的NOTIFY_URL了,要跟微信支付配置保持一致。然后到这里为止就成功了,访问index出现QRcode然后用户扫描支付成功 微信服务端调用notify,还有一点要注意的是微信服务端异步调用notify在没接受到SUCCESS返回前都是继续发(目前设定是半小时8次),所以记得要返回SUCCESS哟(给出的代码已经返回了),然后最好就做好重复notify的冲突处理,例如判断订单是否被处理过了,避免订单被重复刷新。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号