• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

App微信支付之php后台接口详解

php 搞代码 3年前 (2022-01-22) 23次浏览 已收录 0个评论
文章目录[隐藏]

本文将和大家介绍App微信支付(2016.10.11)的php(7.0)后台支付和回调接口,框架是Thinkphp5.0:希望能帮助到大家。

  • 账户的各种参数

  • 订单信息

  • 请求prepay_id

  • *返回APP数据处理

  • 微信回调

  • 修改订单状态


账户的各种参数

账户的各种参数就是像微信申请app支付的时候会给你的账户邮箱发邮件,里面会有对应的微信支付分配的商户号(MCHID),APPID和APPSECRET是在申请app支付权限的时候返回的,还有KEY需要自己在用户微信的商家后台里面自己设置的,这个很重要!避免外泄!

订单信息

  • **客户端会把购物车里面的商品数据传到后台,还包括用户的信息等,拿到数据后首先需要验证这些数据,这里的验证一般都会在项目初期就和客户端定好传输规则,比如传输方式,参数名,验证参数的方式,这里的重点就是验证,一般都会采用签名认证的方式:

  • //签名步骤一:按字典序排序参数;

  • 这里给出(格式化参数格式化成url参数)代码实例:

/**     * 格式化参数格式化成url参数     */    public function ToUrlParams()    {        $buff = "";        foreach ($this->values as $k => $v)        {            if($k != "sign" && $v != "" && !is_array($v)){                $buff .= $k . "=" . $v . "&";            }        }        $buff = trim($buff, "&");        return $buff;    }
  • //签名步骤二:在string后加入KEY(这个KEY与前端人员协商而定);

  • //签名步骤三:MD5加密;

  • //签名步骤四:所有字符转为大写

这些最好在项目初期就封装好,后期会只要调用就好,例:
(后期只需要, $param = $this->request('参数名'));即可), 然后将订单信息预存储.

请求prepay_id

这里我就直接上代码吧,(这里给出接口文档下载地址:),虽然网上也有很多自己写请求接口,但是既然微信已经封装好了,用就行了:

$input = new \app\wxpay\WxPayUnifiedOrder();//这里引用微信的统一下单接口$input->SetBody($data['gname']['g_name']);//商品或支付单简要描述$input->SetAttach($data['gname']['g_name']);//置附加数据 $input->SetOut_trade_no($order_sn); // 商户订单号$input->SetTotal_fee(intval($data['data']['order_price']*100)); $input->SetTime_start(date("YmdHis"));//订单生成时间$input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间$input->SetGoods_tag($data['gname']['g_name']); //商品标记  $input->SetNotify_url("http://www.weixin.qq.com/wxpay/notify.php"); // 支付成功后的回调地址,$input->SetTrade_type("APP");$order = \app\wxpay\WxPayApi::unifiedOrder($input);return $order[&<div style="color:transparent">!本文来源gaodai.ma#com搞#代!码(网</div><em>搞gaodaima代码</em>#39;prepay_id'];

这里给出微信官方统一下单接口说明地址:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

返回客户端信息

$info = array();//账号的信息一般都放在配置文件里面,用到的地方也很多$info['appid'] = config('APP_APPID');$info['partnerid'] = config('APP_MCHID');$info['package'] = config('APP_PACKAGE');$info['noncestr'] = $this->random_number();//生成随机数,下面有生成实例,统一下单接口需要$info['timestamp'] = time();$info['prepayid'] = $prepay_id;$info['sign'] = self::_makeSign($info);//生成签名return $info;

$info就是客户端需要的信息啦
生成随机数实例

//生成随机数    public function random_number($len=21,$format='ALL' ){        $is_abc = $is_numer = 0;        $password = $tmp ='';        switch($format){            case 'ALL':            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';            break;            case 'CHAR':            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';            break;            case 'NUMBER':            $chars='0123456789';            break;            default :            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';            break;        } // www.gaodaima.com        mt_srand((double)microtime()*1000000*getmypid());        while(strlen($password)<$len){            $tmp =substr($chars,(mt_rand()%strlen($chars)),1);            if(($is_numer <> 1 && is_numeric($tmp) && $tmp >0 )|| $format == 'CHAR'){                $is_numer = 1;            }            if(($is_abc <> 1 && preg_match('/[a-zA-Z]/',$tmp)) || $format == 'NUMBER'){                $is_abc = 1;            }            $password.= $tmp;        }        if($is_numer <> 1 || $is_abc <> 1 || empty($password) ){            $password = $this->random_number($len,$format);        }        return $password;        }

微信回调

支付结果通知 notify.php(这里的地址就是统一下单时填写的回调地址,微信已经封装好),文档下载地址
http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
其实这个页面最主要的代码就两行

[php] view plain copy

    $notify = new PayNotifyCallBack();      $notify->Handle(false);

其中大部分逻辑在 Handle 函数中处理 文件 WxPay.Notify.php

[php] view plain copy

    final public function Handle($needSign = true)          {              $msg = "OK";              //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败              $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);              if($result == false){                  $this->SetReturn_code("FAIL");                  $this->SetReturn_msg($msg);                  $this->ReplyNotify(false);                  return;              } else {                  //该分支在成功回调到NotifyCallBack方法,处理完成之后流程                  $this->SetReturn_code("SUCCESS");                  $this->SetReturn_msg("OK");              }              $this->ReplyNotify($needSign);          }

主要代码:
[php] view plain copy

    $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);

跟踪函数 notify 文件WxPay.Api.php

[php] view plain copy

    public static function notify($callback, &$msg)          {              //获取通知的数据              $xml = $GLOBALS['HTTP_RAW_POST_DATA'];              //如果返回成功则验证签名              try {                  $result = WxPayResults::Init($xml);              } catch (WxPayException $e){                  $msg = $e->errorMessage();                  return false;              }              return call_user_func($callback, $result);          }

通过 $GLOBALS[‘HTTP_RAW_POST_DATA’]; 获取同志数据 然后 Init 函数验证签名等。验签成功运行代码.
这里需要说明一下,php7本身不支持$GLOBALS[‘HTTP_RAW_POST_DATA’],需要下载一个插件,具体什么可自行百度,我想说的是可以用file_get_contents(‘php://input’),具体原因可参照下面的博客,写的很详细(https://my.oschina.net/jiec/blog/485359)
[php] view plain copy

return call_user_func($callback, $result);

即调用了一个回调函数,NotifyCallBack() 函数并传递参数 $result 在NotifyCallBack函数中会调用我们重写的NotifyProcess()函数(此函数在notify.php 中被重写)

NotifyProcess() 判断也没有问题就会 设置返回 success的xml信息

[php] view plain copy

$this->SetReturn_code("SUCCESS");  $this->SetReturn_msg("OK");

并最终调用函数 this−>ReplyNotify(this−>ReplyNotify(needSign); echo success的结果

函数ReplyNotify 需要修改一处代码:

[php] view plain copy

final private function ReplyNotify($needSign = true)      {          //如果需要签名          if($needSign == true &&               $this->GetReturn_code($return_code) == "SUCCESS")          {              $this->SetSign();          }          WxpayApi::replyNotify($this->ToXml());      }

[php] view plain copy

$this->GetReturn_code($return_code) == "SUCCESS")

改为

[php] view plain copy

$this->GetReturn_code() == "SUCCESS")

即可。
然后是根据返回信息修改订单状态,主要就是,在什么地方修改,我是在notify.php里面新建了一个方法

//修改订单状态    public function updateState($data){        if($data){            $order_sn = $data['out_trade_no'];\            $data = array();            $data['order_id'] = $order_id;            //修改订单状态(用curlpost方法请求至thinkphp目录下的Controller里面控制器里面的方法,修改状态)            $url = 'www.test.com';            header('content-type:text/html;charset=utf8');            $curl = curl_init();            curl_setopt($curl, CURLOPT_URL, $url);            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);            curl_setopt($curl, CURLOPT_POST, true);            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);            $result = curl_exec($curl);            curl_close($curl);            if($result == 'success'){                return true;            }else{                return false;            }        }    }

然后在notify.php 的

$notify = new PayNotifyCallBack();$notify->Handle(false);

下面加上

//接受参数,修改状态$xml = file_get_contents("php://input");$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);$notify->updateState($data);

相关推荐:

PHP后台接口的一些问题

5 分钟实现微信支付接入教程

php初学者如何学习实现微信支付和支付宝支付的相关教程

以上就是App微信支付之php后台接口详解的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:App微信支付之php后台接口详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址