加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

​ PHP实现微信支付及退款流程的实例说明

发布时间:2022-07-29 13:56:21 所属栏目:PHP教程 来源:互联网
导读:PHP实现微信支付及退款流程实例 微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可。本篇文章后端使用的是php,侧重于整个支付的流程和一些细节方面的东西。所以使用其他后端语言的朋友有
  PHP实现微信支付及退款流程实例
 
  微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可。本篇文章后端使用的是php,侧重于整个支付的流程和一些细节方面的东西。所以使用其他后端语言的朋友有需要也是可以看一下的。很多时候开发的需求和相应问题的解决真的要跳出语言语法层面,去从系统和流程的角度考虑。
 
  一、微信支付
 
  支付主要分为几个步骤:
 
  前端携带支付需要的数据(商品id,购买数量等)发起支付请求
 
  后端在接收到支付请求后,处理支付数据,然后携带处理后的数据请求 微信服务器 的 支付统一下单接口
 
  后端接收到上一步请求微信服务器的返回数据,再次处理,然后返回前端让前端可以开始支付。
 
  前端进行支付动作
 
  前端支付完成后,微信服务器会向后端发送支付通知(也就是微信要告诉你客户已经付过钱了),后端根据这个通知确定支付完成,然后就去做支付完成后的相应动作,比如修改订单状态,添加交易日志啊等等。
 
  从这几个步骤可以看出,后端主要的作用就是将支付需要的数据传给微信服务器,再根据微信服务器的响应确定支付是否完成。
 
  这个流程还是蛮容易理解的。形象的说,前端就是个顾客,后端就是店家,微信服务器的统一下单接口就像收银员。顾客跟店家说,我是谁谁谁,现在我要付多少多少钱给你买什么什么。店家就跟收银员说,那个谁谁谁要付多少钱,你准备收钱吧。收银员收到钱后,就去告诉店家,我已经收到钱了,你给他东西吧。
 
  下面就详细的说明一下各个步骤的具体实现。
 
  1. 前端请求支付
 
  前端请求支付,就是简单的携带支付需要的数据,例如用户标识,支付金额,支付订单 ID 等等跟 **你的业务逻辑有关** 或者跟 **下一步请求微信服务器支付统一下单接口需要的数据有关** 的相关数据,使用微信小程序的 wx.request( ) 去请求后端的支付接口。
 
  2. 后端请求微信服务器
 
  后端接收到前端发送的支付请求后,可以进行一下相关验证,例如判断一下用户有没有问题,支付金额对不对等等。
 
  在验证没什么问题,可以向微信服务器申请支付之后,后端需要使用 微信规定的数据格式 去请求微信的支付统一下单接口。
 
  微信规定的请求数据:
 
  这需要较多代码实现。因为需要的数据个数较多,而且还需要加密并以 XML 格式发送。
 
 
  微信服务器回调通知接口地址 notify_url。微信确认钱已经到账后,会往这个地址多次发送消息,告诉你顾客已经付完钱了,你需要返回消息给微信表示你已经收到了通知。。这个地址不能有端口号,同时要能直接接受POST方法请求。
 
  交易类型 trade_type 。微信小程序支付此值统一为 JSAPI
 
  商品信息 Body。类似"腾讯-游戏"这种格式
 
  终端IP地址 spbill_create_ip 。终端地址IP,也就是请求支付的 IP 地址。
 
  随机字符串 nonce_str 。需要后端随机生成的字符串用于保证数据安全。微信要求不长于32位。
 
  签名 sign 。使用上面的所有参数进行相应处理加密生成签名。(具体处理方式可见下文代码,可直接复用。)
 
  在处理好以上所有数据后,将这些数据以 XML 格式整理并以 POST 方法发送到 微信支付统一下单接口
 
  3.后端接受微信服务器返回数据
 
  微信服务器在接收到支付数据之后,如果数据没有问题,其会返回用于支付的相应数据,其中非常重要的是 名称为 prepay_id 的数据字段,需要将此数据返回前端,前端才能继续支付。
 
  因此,在后端接收到微信服务器的返回数据后,需要进行相应的处理,最终返回到前端如下数据:
 
  appid 不需多说
 
  timeStamp 当前时间戳
 
  nonceStr 随机字符串
 
  4. 前端发起支付
 
  前端在接收到返回数据后,使用 wx.requestPayment() 来请求发起支付。此 API 需要的对象参数各项值就是我们上一步返回的各个数据。
 
  5.后端接受微信服务器回调
 
  前端完成支付后,微信服务器确认支付已经完成。就会向第一步中设置的回调地址发送通知。后端的接收回调接口在接收到通知后,就可以判断支付是否完成,从而决定后续动作。
 
  需要注意的是,在接收到微信服务器的回调通知后,根据通知的result_code字段判断支付是否成功。在接受到成功的通知后,后端需要返回success数据向微信服务器告知已得到回调通知。否则微信服务器会不停的向后端发送消息。另外微信的通知是以XML格式发送的,在接受处理时需要注意。
 
  微信的大概支付流程就是这样。以下是PHP语法的微信支付类,可以比照上面的步骤介绍,加深理解。在需要支付时,直接传入参数实例化此类再调用类的 pay 方法即可。
 
  //微信支付类
 
 
 
 
 
  class WeiXinPay{
 
    //=======【基本信息设置】=====================================
 
    //微信公众号身份的唯一标识
 
    protected $APPID = appid;//填写您的appid。微信公众平台里的
 
    protected $APPSECRET = secret;
 
    //受理商ID,身份标识
 
    protected $MCHID = '11111111';//商户id
 
    //商户支付密钥Key
 
    protected $KEY = '192006250b4c09247ec02edce69f6a2d';
 
    //回调通知接口
 
    protected $APPURL =   'https://smart.afei.com/receivesuc';
 
      $this->openid = $openid; //用户唯一标识
 
      $this->outTradeNo = $outTradeNo; //商品编号
 
      $this->totalFee = $totalFee; //总价
 
    }
 
    //微信支付类向外暴露的支付接口
 
    public function pay(){
 
      $result = $this->weixinapp();
 
      return $result;
 
    }
 
     //对微信统一下单接口返回的支付相关数据进行处理
 
     private function weixinapp(){
 
       $unifiedorder=$this->unifiedorder();
 
       $parameters=array(
 
       'appId'=>$this->APPID,//小程序ID
 
       'timeStamp'=>''.time().'',//时间戳
 
       'nonceStr'=>$this->createNoncestr(),//随机串
 
     */
 
    private function unifiedorder(){
 
      $parameters = array(
 
        'appid' => $this->APPID,//小程序id
 
        'mch_id'=> $this->MCHID,//商户id
 
        'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],//终端ip
 
        'notify_url'=>$this->APPURL, //通知地址
 
        'nonce_str'=> $this->createNoncestr(),//随机字符串
 
        'out_trade_no'=>$this->outTradeNo,//商户订单编号
 
        'total_fee'=>floatval($this->totalFee), //总金额
 
        'open_id'=>$this->openid,//用户openid
 
        'trade_type'=>$this->TRADETYPE,//交易类型
 
        'body' =>$this->BODY, //商品信息
 
      );
 
 
      foreach ($arr as $key=>$val)
 
      {
 
        if (is_numeric($val)){
 
          $xml.="<".$key.">".$val."</".$key.">";
 
        }else{
 
           $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
 
        }
 
      }
 
      $xml.="</xml>";
 
      return $xml;
 
    }
 
    protected function xmlToArray($xml){
 
      $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
 
      return $array_data;
 
    }
 
    //发送xml请求方法
 
    private static function postXmlCurl($xml, $url, $second = 30)
 
    {

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读