在开发之中经常会使用到支付的功能,现在常用的两种支付方式是支付宝和微信。相对而言,支付宝的文档较为健全,并且配置和调用方式方式比较简单,这里就不过多的描述。
首先去微信官网网站下去下载服务端的demo:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php"htmlcode">
/* 微信APP下支付预下单 */ public function wxAppOrder(){ //TODO:首先获取订单详情,例如传递过来订单号或订单id,获取订单的详情信息,例如将取出的数据存放入$user_order_info数组,订单中包含的商品在$user_order_product_info之中。 /* 向微信发起请求 */ vendor('WxpayAPI.lib.WxPay','','.Api.php'); vendor('WxpayAPI.lib.WxPay','','.Data.php');//生成数据 //统一下单输入对象 $order_info= new WxPayUnifiedOrder(); $order_info->SetOut_trade_no($user_order_info['orderNo']);//商品订单号 $body=$user_order_product_info['productName']; // $body=iconv('UTF-8', 'ISO-8859-1', $user_order_product_info['productName']); $order_info->SetBody($body);//商品描述 $order_info->SetTrade_type('CNY');//人民币 $order_info->SetTotal_fee(intval($user_order_info['sumPrice']*100));//总金额,以分为单位 $order_info->SetTrade_type('APP');//交易类型 $order_info->SetAppid(C('wxAPPID')); $order_info->SetMch_id(C('wxMCHID')); $order_info->SetNotify_url('你的回调地址'); $order_info->SetSign(); //进行统一支付 $wxpay=new WxPayApi(); $order_result=$wxpay->unifiedOrder($order_info);//统一下单 if ($order_result['return_code']=='FAIL') { $arr=array( 'resultCode'=>'99', 'resultDesc'=>$order_result['return_msg'], 'resultObj'=>array(''=>''), ); echo JSON($arr); exit(); } if ($order_result['result_code']=='SUCCESS') { //预下单成功后,重新签名返回给移动端 $wxpay_result=new WxPayResults(); $timestamp=time(); $wxpay_result->SetData('appid', $order_result['appid']); $wxpay_result->SetData('partnerid', $order_result['mch_id']); $wxpay_result->SetData('prepayid', $order_result['prepay_id']); $wxpay_result->SetData('timestamp', $timestamp); $wxpay_result->SetData('noncestr', $order_result['nonce_str']); $wxpay_result->SetData('package', 'Sign=WXPay'); // $wxpay_result->SetData('key', C('wxKEY')); //上方注释的代码是再签名中必要的一步,只是这个包含在了微信demo的类中,如果像该项目中既有app支付,又有公众号支付,最好是注释类中代码,并自己写入 $resign_result=$wxpay_result->SetSign(); //处理返回数据 $result=array( 'appid'=>$order_result['appid'],//appid 'partnerid'=>$order_result['mch_id'],//商户号 'prepayid'=>$order_result['prepay_id'],//与支付id 'package'=>'Sign=WXPay', 'noncestr'=>$order_result['nonce_str'], 'timestamp'=>$timestamp, 'sign'=>$resign_result, ); $arr=array( 'resultCode'=>'00', 'resultDesc'=>'成功', 'resultObj'=>$result, ); echo JSON($arr); exit(); }else{ $arr=array( 'resultCode'=>'99', 'resultDesc'=>'失败', 'resultObj'=>$order_result, ); echo JSON($arr); exit(); } } /* 微信支付回调函数 */ public function wxpayNotify(){ vendor('WxpayAPI.lib.Logwx','','.Log.php');//在回调中最好是引入日志进行记录,在这里因为Log类与thinkphp中的log类重复,需要进行处理 $handle=new CLogFileHandler('./Public/wxlog.txt'); $log=Logwx::Init($handle); $xml = $GLOBALS['HTTP_RAW_POST_DATA'];//获取数据 vendor('WxpayAPI.lib.WxPay','','.Api.php'); vendor('WxpayAPI.lib.WxPay','','.Data.php'); $wxpay=new WxPayApi(); $notify=new WxPayNotifyReply(); $result=WxPayResults::Init($xml);//获取数据并转换为数组 if ($result['return_code']=='SUCCESS' && $result['result_code']=='SUCCESS') {//此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 //TODO:进行数据库操作的业务逻辑处理,假设其成功与否的数据为$res if ($res) { $log->INFO('订单:'.$result['out_trade_no'].'支付成功'); $notify->SetReturn_code('SUCCESS'); $notify->SetReturn_msg('OK'); $notify->SetSign(); }else{ $log->ERROR('微信支付失败'); $notify->SetReturn_code('FAIL'); $notify->SetReturn_msg('客户服务器错误'); } }else{ $log->ERROR('微信回调返回错误'); $notify->SetReturn_code('FAIL'); $notify->SetReturn_msg('微信支付失败'); } //返回微信端 $wxpay->replyNotify($notify->ToXml()); } /* 微信公众账号下单 * 获取code等信息 * 跳转至获取信息 * */ public function wxPubOrder(){ //此流程中 $orderId=$_GET['orderId']; //注意:此处如果想要回调成功,需要在微信公众平台设置回调域名 // print_r('Location:https://open.weixin.qq.com/connect/oauth2/authorize"appid"]); $timeStamp = time(); $jsapi->SetTimeStamp("$timeStamp"); $jsapi->SetNonceStr(WxPayApi::getNonceStr()); $jsapi->SetPackage("prepay_id=" . $order_result['prepay_id']); $jsapi->SetSignType("MD5"); $jsapi->SetPaySign($jsapi->MakeSign()); $order_result = $jsapi->GetValues(); // print_r($order_result);exit(); $arr=array( 'resultCode'=>'00', 'resultDesc'=>'成功', 'resultObj'=>$order_result, ); echo JSON($arr); exit(); }else{ $arr=array( 'resultCode'=>'99', 'resultDesc'=>'失败', 'resultObj'=>$order_result, ); echo JSON($arr); exit(); } }
这就是一个支付的流程,在这之中会遇到很多问题,在此给出一个大多数会遇到的问题的解决方法的大概思路:
- 1、APP统一下单后数据返回给前端,前端调用报签名错误:首先验证自己的秘钥信息是否正确,要注意移动端和公众号的是不同的,而类拿着key又去重新签名,可以将微信官方提供的demo中的直接内部调用配置文件那里注释掉
- 2、在公众号获取openid的时候,显示跨域:这个解决参考YII2框架中对于\yii::$app->response->header,中的remove方法,将报头去掉即可。
- 3、对于微信支付的配置,包括公众号支付配置白名单、测试目录啥的就不过多说了,请自行搜索资料
过程中肯定还遇到很多问题,这里不一一写了,如果还有问题可以在评论中留言,大家一起讨论学习,共同进步。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
狼山资源网 Copyright www.pvsay.com
暂无“PHP的微信支付接口使用方法讲解”评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?