微信ウィジェット-微信支払い返金(直接使用可能)

34237 ワード

//       

namespace app\pay\controller;

/*
 *          
 */
class Winxinrefund{

  protected $SSLCERT_PATH = APP_PATH.'/pay/cert/apiclient_cert.pem';//    
  protected $SSLKEY_PATH =  APP_PATH.'/pay/cert/apiclient_key.pem';//    
  protected $opUserId = '';//   
  protected $KEY = '';

  function __construct($openid,$outTradeNo,$totalFee,$outRefundNo,$refundFee){

    //           

    $this->openid = $openid;

    $this->outTradeNo = $outTradeNo;

    $this->totalFee = $totalFee*100;

    $this->outRefundNo = $outRefundNo;

    $this->refundFee = $refundFee*100;

  }

  public function refund(){

    //         

    $result = $this->wxrefundapi();

    return $result;

  }

  private function wxrefundapi(){

    //    api      

    $parma = array(

      'appid'=> 'wx9aa3d23bd288511a',

      'mch_id'=> '1594691381',

      'nonce_str'=> $this->createNoncestr(),

      'out_refund_no'=> $this->outRefundNo,

      'out_trade_no'=> $this->outTradeNo,

      'total_fee'=> $this->totalFee,

      'refund_fee'=> $this->refundFee

    );
    $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;

  }
protected function getSign($Obj){
    foreach ($Obj as $k => $v){
        $Parameters[$k] = $v;
    }
    //     :        
    ksort($Parameters);
    $String = $this->formatBizQueryParaMap($Parameters, false);
    //     : string   KEY
    $String = $String."&key=".$this->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 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 arrayToXml($arr){
    $xml = "";
    foreach ($arr as $key=>$val)
    {
        if (is_numeric($val)){
            $xml.=".$key.">".$val."".$key.">";
        }else{
            $xml.=".$key.">.$val."]]>".$key.">";
        }
    }
    $xml.="";
    return $xml;
}

protected static function xmlToArray($xml){
  // dump($xml);die;
    $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,    
    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"."
"
; curl_close($ch); return false; } } }

PHPは返金インタフェースを呼び出し、返金機能を実現する
$pay = new Winxinrefund($openid,         ,     ,    ,    );
$result = $pay->refund();

そして返金に成功しました.