微信

退款

 /*
   * 发送请求
   @param $ordersNo string 订单号 
   @param $refund string 退款单号
   @param $price float 退款金额
   return array
   */
  private function wxrefundapi($ordersNo, $refund, $total_fee, $price) {
    //通过微信api进行退款流程
    $db = DBAction::getInstance();
    $sql = "select * from lkt_config where id=1";
    $r = $db -> select($sql);
    if ($r) {
      $appid = $r[0]->appid;
      // 小程序唯一标识
      $appsecret = $r[0]->appsecret;
      // 小程序的 app secret
      $company = $r[0] ->company;
      $mch_key = $r[0]->mch_key; // 商户key
      $mch_id = $r[0]->mch_id; // 商户mch_id
    }

    $parma = array('appid' => $appid, 'mch_id' => $mch_id, 'nonce_str' => $this -> createNoncestr(), 'out_refund_no' => $refund, 'out_trade_no' => $ordersNo, 'total_fee' => $total_fee, 'refund_fee' => $price, 'op_user_id' =>  $appid);
    $parma['sign'] = $this -> getSign($parma,$mch_key);
    $xmldata = $this -> arrayToXml($parma);
    $xmlresult = $this -> postXmlSSLCurl($xmldata, 'https://api.mch.weixin.qq.com/secapi/pay/refund');
    $result = $this -> xmlToArray($xmlresult);
    return $result;
  }

  /*
   * 生成随机字符串方法
   */
  protected function createNoncestr($length = 32) {
    $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
  }
   /*
   * 对要发送到微信统一下单接口的数据进行签名
   */
  protected function getSign($Obj,$mch_key) {
    foreach ($Obj as $k => $v) {
      $Parameters[$k] = $v;
    }
    //签名步骤一:按字典序排序参数
    ksort($Parameters);
    $String = $this -> formatBizQueryParaMap($Parameters, false);
    //签名步骤二:在string后加入KEY
    $String = $String . "&key=".$mch_key;
    //签名步骤三:MD5加密
    $String = md5($String);
    //签名步骤四:所有字符转为大写
    $result_ = strtoupper($String);
    return $result_;
  }
   /*
   * 对要发送到微信统一下单接口的数据进行签名
   */
  protected function getSign($Obj,$mch_key) {
    foreach ($Obj as $k => $v) {
      $Parameters[$k] = $v;
    }
    //签名步骤一:按字典序排序参数
    ksort($Parameters);
    $String = $this -> formatBizQueryParaMap($Parameters, false);
    //签名步骤二:在string后加入KEY
    $String = $String . "&key=".$mch_key;
    //签名步骤三:MD5加密
    $String = md5($String);
    //签名步骤四:所有字符转为大写
    $result_ = strtoupper($String);
    return $result_;
  }
    /*
   *排序并格式化参数方法,签名时需要使用
   */
  protected function formatBizQueryParaMap($paraMap, $urlencode){
    $buff = "";
    ksort($paraMap);
    foreach ($paraMap as $k => $v){
      if($urlencode){
        $v = urlencode($v);
      }
      //$buff .= strtolower($k) . "=" . $v . "&";
      $buff .= $k . "=" . $v . "&";
    }
    $reqPar = '';
    if (strlen($buff) > 0){
      $reqPar = substr($buff, 0, strlen($buff)-1);
    }
    return $reqPar;
  }
    //数组转字符串方法
  protected function arrayToXml($arr){
    $xml = "<xml>";
    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;
  }
   //需要使用证书的请求
   private 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,可以注释
      $cert = str_replace('lib','filter',MO_LIB_DIR).'/apiclient_cert.pem';
      $key = str_replace('lib','filter',MO_LIB_DIR).'/apiclient_key.pem';
      curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
      curl_setopt($ch,CURLOPT_SSLCERT, $cert);
      //默认格式为PEM,可以注释
      curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
      curl_setopt($ch,CURLOPT_SSLKEY, $key);
      //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;
      }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值