>  기사  >  php教程  >  CI 프레임워크를 활용한 WeChat 앱 결제

CI 프레임워크를 활용한 WeChat 앱 결제

WBOY
WBOY원래의
2016-09-03 00:00:411159검색

/**
* WeChat 앱 결제를 결합하여 선불 결제
* @param int $order_num
*/
비공개 함수 _wxpay_request($order_num = 0)
{

//주문 번호는 0이 아닌 배열이어야 합니다
check_order_num( $order_num);

//WeChat 결제 클래스 소개
library_include("wxpay/", "WxPayHelper.app.php");

//결제 인터페이스에서 URL 시작
$pay_url = $this->config->item("PAY_URL");
                                                                 ;
 > ()당;
                                                                                                  ~                         >order_model->get_one($order_num);
                                                                                                                  "body"] = $pay_config['body'];//제품 또는 결제 주문에 대한 간략한 설명
$data["mch_id"] = $pay_config['mch_id'];//판매자 번호
$data[ "nonce_str"] = $nonce_str;//임의의 문자열
$data["notify_url"] = $notify_url;//알림 주소
$data["out_trade_no"] = $order_data[" order_num"]; //가맹점 주문 번호
$data["spbill_create_ip"] = $helper->get_client_ip();//단말기 IP
$data["total_fee"] = $order_data['total' ] * 100; // 총 금액 $ data ["trade_type"] = "app"; // 거래 ​​유형
$ data ["sign"] = $ Helper- & gt; $ pay_config ['partner' ]);//서명
      $xml    = $helper->arrayToXml($data)"]) && $responseArr["return_code"]=='SUCCESS' && isset($responseArr['result_code']) && $responseArr["result_code"]=='SUCCESS'){
     
   
$data_pay["appid"] = $pay_config['appid'] ;
$data_pay["noncestr"] = $nonce_str;
$data_pay["package"] = "Sign=WXPay";
$data_pay["partnerid"] = $pay_config['mch_id'] ;
$data_pay["prepayid"] = $responseArr['prepay_id'];
$data_pay["timestamp"] = 시간( );
            $ data_pay [ "sign"] = $ helper- & gt; getSign ($ data_pay, $ pay_config [ 'partner']); // 二 二 次 签名

$ this- & gt; response = array ( 'status'=>0, 'msg'=>'성공', 'data'=>$data_pay);
        }else{
        
            $return_msg = $responseArr['err_code_des'] ;    
             $this->response = array('status'=>0, 'msg'=>$return_msg, 'data'=>$responseArr);
        }
      
        
        
               
    }

//helper.php


class WxPayHelper{

/**
* 서명 확인
* @param array $data
* @param string $key
* @return string
*/
function getVerifySign($data, $key)
{
$ String = $this->formatParameters($data, false);
//서명 2단계: 문자열 $String = $String "&key=" .
/Signature 뒤에 추가합니다. 3단계: MD5 암호화
$String = md5($String);
//서명 4단계: 모든 문자를 대문자로 변환
$result = strtoupper($String);
return $ result;
}

함수 formatParameters($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($ paraMap AS $ k = & gt; $ v) {
if ($ k == "sign") {
계속
}
if ($ urlencode) {
$ v = Urlencode ( $ v);
$ k. "=". $ v. "&"
$ ReqPar
if ($ buff); ; 0) {
                                                                         
* 서명 가져오기
* @param object $obj
* @param string $api_key
* @return string
*/
함수 getSign($obj, $api_ 키)
{
foreach($obj를 $k => $v)
{
$Parameters[strtolower($ k)] = $v;
}
//서명 1단계: 매개변수를 사전순으로 정렬
ksort($Parameters);
$String = $this-> formatBizQueryParaMap($Parameters, false);
//서명 2단계: 문자열 뒤에 KEY
추가 $String = $String."&key=".$api_key;
//서명 3단계: MD5 암호화
$result = strtoupper(md5($String));
           return $result; = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) -1;
for($i=0;$i<$length;$i++) {
$str.=$strPol[rand(0,$max)];//rand($min,$max)는 무작위를 생성합니다. 최소와 최대 사이의 정수
}
return $ str;
}

/**
* 지정된 길이의 임의 문자열 가져오기
* @param int $length
* @return Ambigous
*/
function arrayToXml($arr)
{

        header("콘텐츠 유형: 텍스트/xml");            
        
        $xml = '';    
    
        foreach ($arr as $key=>$val)
        {
             if (is_numeric($val))
            {
               $xml .="<". $key.">".$val."";

            }
            else
               $xml.="<".$key.">";  
        }
        $xml.= '
';
        return $xml;
    }
    
    /**
* 포스트 모드에서 해당 인터페이스 url에 xml 제출 useCert 인증서 필수 여부, 기본값은 필요하지 않음
* @param int $second URL 실행 시간 초과, 기본값은 30초
* @throws WxPayException
*/
    function postXmlCurl($xml, $url, $second=30, $useCert=false, $sslcert_path='', $sslkey_path=' ')
    {

        $ch = cur_init();
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        curl _setopt($ch,CURLOPT_URL, $url);

        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
       //要求结果为字符串且输到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    
        if($useCert == true){
            curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
            //设置证书
            //使用证书:cert 与 키 分别属于两个. pem文件
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLCERT, $sslcert_path);
            curl_setopt($ch ,CURLOPT_SSLKEYTYPE,'PEM');
            curl_setopt ($ch,CURLOPT_SSLKEY, $sslkey_path);
        }
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch , CURLOPT_POSTFIELDS, $xml);
        //运行curl
        $data =curl_exec($ch);
        
        //返回结果
        if($data){
           curl_close($ch);
            return 정의 }
    }

    /**
     * 获取当前服务器적IP
     * @return 모호한 <문자열, 알 수 없음>
     */
    function get_client_ip()
    {
        if (isset($_SERVER['REMOTE_ADDR']) ) {
            $cip = $_SERVER['REMOTE_ADDR'];
       } elseif (getenv("REMOTE_ADDR")) {
           $cip = getenv("REMOTE_ADDR");
       } elseif ( getenv ("HTTP_CLIENT_IP")) {
            $cip = getenv("HTTP_CLIENT_IP");
        } else {
           $cip = "127.0.0.1";
        }
        $cip 반환;
    }
 
    /**
* 배열을 uri 문자열로 변환
* @param array $paraMap
* @param bool $urlencode
* @return string
*/
    함수 formatBizQueryParaMap($paraMap, $urlencode)
    {
        $buff = "";
        ksort($paraMap) ;
        foreach ($paraMap as $k => $v)
        {
            if($urlencode)
            {
               $v = urlencode($v);
            }
            $buff .= strtolower($k) . "=" . $v . "&";
        }
        $reqPar;
        if (strlen($buff) > 0)
        {
            $reqPar = substr($buff, 0, strlen($buff) -1); }
return $ reqpar;
}

/**
* XML을 배열로
* @param 알 수 없음 $xml
* @return 혼합
*/
함수 xmltoArray ($ xml) // /将XML转为array
        $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $array_data;
    }
    
}
    
    
?>

 

//异步통지

/**
* 위챗 메시지 주소
*/
    공개 함수 weixin_notify()
    {
        
        
        library_include("wxpay/", "WxPayHelper.app.php");
        $helper = new WxPayHelper();        
        //微信配置
        $pay_config = $this->config->item("WEIXIN_PAY_NEED");    
       

        $xml = file_get_contents("php://input");
       
        if(!$xml){
            exit('');
        }
       
        $wx_back = $helper->xmlToArray($xml);
        
    
        if(empty($wx_back)){
            exit('');
        }
        $checkSign = $helper->getVerifySign($wx_back, $pay_config['partner']);
        
        //验证签명        
        if($checkSign==$wx_back['sign']){
            
            if (isset( $wx_back['결과_코드']) && $wx_back[ 'result_code']=='성공') {
                $requestReturnData = file_get_contents("php://input");
                //商户订单号
               $out _trade_no = $wx_back['out_trade_no']; [ "transaction_id"];
                
                //交易状态
                $trade_status = $wx_back ['result_code'];
                
                //订单金额 保留小数点后两位
               $total_fee("% .2f", $wx_back['total_fee']/100);

               //공사业务处리

 


                //处理后同步返回给微信

                exit('<[CDATA[SUCCESS]]>< ![CDATA[OK]]>');

            }

            

            
        }
        종료('< ;xml> ');
        

    }

 


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.