微信小程序支付及退款流程详解(5)

  • 退款金额 refund_fee 需要退款的金额,单位同样为分
  • 操作员 op_user_id .与商户号相同即可
  • 随机字符串 nonce_str 。同支付请求
  • 签名 sign 。使用上面的所有参数进行相应处理加密生成签名。(具体处理方式与支付相同,可直接复用。)
  • 三. 退款完成

        在发起退款请求后,就可以直接根据请求的响应XML中的  result_code字段来判断退款是否成功,从而对订单状态进行处理和后续操作。不需要像支付那样等待另一个接口的通知来确定请求状态。当然如上文所说,如果需要微信服务器发送通知到后端的话,可以到微信商户平台进行设置。

    退款因为流程与支付大同小异,因此退款的PHP类我选择了直接继承支付类,

    代码如下,注意区分退款请求方法postXmlSSLCurl和支付请求方法postXmlCurl的区别,这也就是上文提到的退款需要的双向证书的使用。

    ````
     class WinXinRefund extends WeiXinPay{
      protected \$SSLCERT_PATH = 'cert/apiclient_cert.pem';//证书路径
      protected \$SSLKEY_PATH = 'cert/apiclient_key.pem';//证书路径
      protected \$opUserId = '1234567899';//商户号
    function __construct($openid,$outTradeNo,$totalFee,$outRefundNo,$refundFee){
      //初始化退款类需要的变量
      $this->openid = $openid;
      $this->outTradeNo = $outTradeNo;
      $this->totalFee = $totalFee;
      $this->outRefundNo = $outRefundNo;
      $this->refundFee = $refundFee;
    } 
    public function refund(){
      //对外暴露的退款接口
      $result = $this->wxrefundapi();
      return $result;
    }
    private function wxrefundapi(){
      //通过微信api进行退款流程
      $parma = array(
        'appid'=> $this->APPID,
        'mch_id'=> $this->MCHID,
        'nonce_str'=> $this->createNoncestr(),
        'out_refund_no'=> $this->outRefundNo,
        'out_trade_no'=> $this->outTradeNo,
        'total_fee'=> $this->totalFee,
        'refund_fee'=> $this->refundFee,
        'op_user_id' => $this->opUserId,
      );
      $parma['sign'] = $this->getSign($parma);
      $xmldata = $this->arrayToXml($parma);
      $xmlresult = $this->postXmlSSLCurl($xmldata,'https://api.mch.weixin.qq.com/secapi/pay/refund');
      $result = $this->xmlToArray($xmlresult);
      return $result;
    }
    //需要使用证书的请求
    function postXmlSSLCurl($xml,$url,$second=30)
    {
      $ch = curl_init();
      //超时时间
      curl_setopt($ch,CURLOPT_TIMEOUT,$second);
      //这里设置代理,如果有的话
      //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
      //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
      curl_setopt($ch,CURLOPT_URL, $url);
      curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
      curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
      //设置header
      curl_setopt($ch,CURLOPT_HEADER,FALSE);
      //要求结果为字符串且输出到屏幕上
      curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
      //设置证书
      //使用证书:cert 与 key 分别属于两个.pem文件
      //默认格式为PEM,可以注释
      curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
      curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);
      //默认格式为PEM,可以注释
      curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
      curl_setopt($ch,CURLOPT_SSLKEY, $this->SSLKEY_PATH);
      //post提交方式
      curl_setopt($ch,CURLOPT_POST, true);
      curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
      $data = curl_exec($ch);
      //返回结果
      if($data){
        curl_close($ch);
        return $data;
      }
      else {
        $error = curl_errno($ch);
        echo "curl出错,错误码:$error"."<br>";
        curl_close($ch);
        return false;
      }
    }}
          

    内容版权声明:除非注明,否则皆为本站原创文章。

    转载注明出处:http://www.heiqu.com/640.html