> 백엔드 개발 > PHP 튜토리얼 > App WeChat Payment의 PHP 백그라운드 인터페이스에 대한 자세한 설명

App WeChat Payment의 PHP 백그라운드 인터페이스에 대한 자세한 설명

小云云
풀어 주다: 2023-03-20 21:28:02
원래의
2923명이 탐색했습니다.

본 글에서는 위챗페이 앱(2016.10.11)의 PHP(7.0) 백그라운드 결제 및 콜백 인터페이스를 소개하겠습니다. 프레임워크는 Thinkphp5.0입니다. 도움이 되셨으면 좋겠습니다.

  • 계정의 다양한 매개변수

  • 주문 정보

  • prepay_id 요청

  • *APP 데이터 처리로 돌아가기

  • WeChat 콜백

  • 주문 상태 수정


계정 다양한 매개변수

계정의 다양한 매개변수는 WeChat이 앱 결제를 신청할 때와 같이 이메일이 계정 사서함으로 전송됩니다. 신청 시 WeChat 결제에서 할당된 해당 판매자 번호(MCHID), APPID 및 APPSECRET가 있습니다. 앱의 경우 결제 시 반환되는 KEY는 WeChat의 판매자 백엔드에서 사용자가 설정해야 합니다.

주문 정보

  • **클라이언트가 콘텐츠를 저장합니다. 장바구니 제품 데이터는 사용자 정보 등을 포함하여 백엔드로 전송됩니다. 데이터를 얻은 후 먼저 데이터를 확인해야 합니다. 여기서 확인에는 일반적으로 프로젝트 시작 시 클라이언트와 전송 규칙을 설정하는 작업이 포함됩니다. 전송 방법, 매개변수 이름 및 매개변수 확인 방법, 여기서는 확인에 중점을 두고 있으며 서명 인증이 일반적으로 사용됩니다.

  • //서명 1단계: 사전순으로 매개변수 정렬

  • 여기에 코드가 있습니다. 예(형식 매개 변수는 URL 매개 변수로 형식화됨):

/**
     * 格式化参数格式化成url参数
     */
    public function ToUrlParams()
    {
        $buff = "";
        foreach ($this->values as $k => $v)
        {            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");        return $buff;
    }
로그인 후 복사
  • //서명 2단계: 문자열 뒤에 KEY 추가(이 KEY는 프런트 엔드 직원과의 협상에 의해 결정됨);


  • //서명 3단계: MD5 암호화;


  • //서명 4단계: 모든 문자를 대문자로 변환


이를 캡슐화하는 것이 가장 좋습니다. 초기에 예를 들어,
(나중에만 필요함, $param = $this->request('매개변수 이름'))(그게 다입니다). 그런 다음 주문 정보를 미리 저장합니다. .

Request prepay_id

여기 코드로 직접 이동하겠습니다. (인터페이스 문서 다운로드는 여기에 제공됩니다. 주소:) 인터넷에는 자체 작성 요청 인터페이스가 많지만 WeChat이 패키지되어 있으므로 다음을 사용하세요. 그것:

$input = new \app\wxpay\WxPayUnifiedOrder();//这里引用微信的统一下单接口

$input->SetBody($data['gname']['g_name']);//商品或支付单简要描述
$input->SetAttach($data['gname']['g_name']);//置附加数据 
$input->SetOut_trade_no($order_sn); // 商户订单号
$input->SetTotal_fee(intval($data['data']['order_price']*100)); 
$input->SetTime_start(date("YmdHis"));//订单生成时间
$input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间
$input->SetGoods_tag($data['gname']['g_name']); //商品标记  
$input->SetNotify_url("http://www.weixin.qq.com/wxpay/notify.php"); // 支付成功后的回调地址,
$input->SetTrade_type("APP");
$order = \app\wxpay\WxPayApi::unifiedOrder($input);return $order['prepay_id'];
로그인 후 복사

여기 공식 WeChat 통합 주문 인터페이스 설명 주소가 있습니다:
https://pay.weixin.qq .com/wiki/doc/api/app/app.php?chapter=9_1

고객 정보 반환

$info = array();
//账号的信息一般都放在配置文件里面,用到的地方也很多
$info['appid'] = config('APP_APPID');
$info['partnerid'] = config('APP_MCHID');
$info['package'] = config('APP_PACKAGE');
$info['noncestr'] = $this->random_number();//生成随机数,下面有生成实例,统一下单接口需要
$info['timestamp'] = time();
$info['prepayid'] = $prepay_id;
$info['sign'] = self::_makeSign($info);//生成签名return $info;
로그인 후 복사

$info는 고객이 필요로 하는 정보입니다
난수 인스턴스 생성

//生成随机数
    public function random_number($len=21,$format='ALL' ){
        $is_abc = $is_numer = 0;
        $password = $tmp ='';
        switch($format){
            case 'ALL':
            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';            break;
            case 'CHAR':
            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';            break;
            case 'NUMBER':
            $chars='0123456789';            break;
            default :
            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';            break;
        } // www.jb51.net
        mt_srand((double)microtime()*1000000*getmypid());        while(strlen($password)<$len){
            $tmp =substr($chars,(mt_rand()%strlen($chars)),1);            if(($is_numer <> 1 && is_numeric($tmp) && $tmp >0 )|| $format == &#39;CHAR&#39;){
                $is_numer = 1;
            }            if(($is_abc <> 1 && preg_match(&#39;/[a-zA-Z]/&#39;,$tmp)) || $format == &#39;NUMBER&#39;){
                $is_abc = 1;
            }
            $password.= $tmp;
        }        if($is_numer <> 1 || $is_abc <> 1 || empty($password) ){
            $password = $this->random_number($len,$format);
        }        return $password;
        }
로그인 후 복사

WeChat 콜백

결제 결과 Notify inform.php (여기 주소는 주문할 때 입력한 콜백 주소이며, WeChat에서 이미 패키징했습니다), 문서 다운로드 주소
http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
사실 이 페이지의 메인 코드는 단 두 줄 뿐입니다

[php] 일반 보기 copy

    $notify = new PayNotifyCallBack();  
    $notify->Handle(false);
로그인 후 복사

대부분의 로직은 파일을 처리하는 Handle 함수에 있습니다. WxPay.Notify.php

[php] view plain copy

    final public function Handle($needSign = true)  
        {  
            $msg = "OK";  
            //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败  
            $result = WxpayApi::notify(array($this, &#39;NotifyCallBack&#39;), $msg);  
            if($result == false){  
                $this->SetReturn_code("FAIL");  
                $this->SetReturn_msg($msg);  
                $this->ReplyNotify(false);  
                return;  
            } else {  
                //该分支在成功回调到NotifyCallBack方法,处理完成之后流程  
                $this->SetReturn_code("SUCCESS");  
                $this->SetReturn_msg("OK");  
            }  
            $this->ReplyNotify($needSign);  
        }
로그인 후 복사

메인 코드:
[php] view plain copy

    $result = WxpayApi::notify(array($this, &#39;NotifyCallBack&#39;), $msg);
로그인 후 복사

Track 함수 알림 파일 WxPay.Api.php

[php] 일반 사본 보기

    public static function notify($callback, &$msg)  
        {  
            //获取通知的数据  
            $xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;];  
            //如果返回成功则验证签名  
            try {  
                $result = WxPayResults::Init($xml);  
            } catch (WxPayException $e){  
                $msg = $e->errorMessage();  
                return false;  
            }  

            return call_user_func($callback, $result);  
        }
로그인 후 복사

$GLOBALS['HTTP_RAW_POST_DATA']를 통해 게이 데이터를 가져온 다음 초기화 기능 확인 서명 등 서명 확인이 성공하고 코드가 실행됩니다.
php7 자체는 $GLOBALS['HTTP_RAW_POST_DATA']를 지원하지 않는다는 점을 설명해야 합니다. 자세한 내용은 Baidu를 참조하세요. 제가 말씀드리고 싶은 것은 file_get_contents('php://input')를 사용할 수 있다는 것입니다. 구체적인 이유는 아래 블로그를 참조하세요. 매우 자세한 내용이 있습니다(https://my.oschina.net/jiec/blog/). 485359)
[php] view plain copy

return call_user_func($callback, $result);
로그인 후 복사

즉, 콜백 함수인 NotifyCallBack이 () 함수로 호출되고 $result 매개변수를 전달합니다. NotifyCallBack 함수에서 다시 작성된 NotifyProcess() 함수가 호출됩니다(이 함수).

NotifyProcess()는 문제가 없다고 판단하고 성공을 반환하는 xml을 설정합니다. 정보

[php] 일반 사본 보기

$this->SetReturn_code("SUCCESS");  
$this->SetReturn_msg("OK");
로그인 후 복사

를 보고 마지막으로 this−>ReplyNotify 함수를 호출합니다. (this−>ReplyNotify(needSign); 에코 성공 결과

ReplyNotify 함수는 하나의 코드를 수정해야 합니다:

[php] view plain copy

final private function ReplyNotify($needSign = true)  
    {  
        //如果需要签名  
        if($needSign == true &&   
            $this->GetReturn_code($return_code) == "SUCCESS")  
        {  
            $this->SetSign();  
        }  
        WxpayApi::replyNotify($this->ToXml());  
    }
로그인 후 복사

[php] view plain copy

$this->GetReturn_code($return_code) == "SUCCESS")
로그인 후 복사

로 변경될 수 있습니다. [php] view plain copy

$this->GetReturn_code() == "SUCCESS")
로그인 후 복사


그리고 반환된 정보를 바탕으로 주문 상태를 수정합니다. 가장 중요한 것은 inform.php에 새로운 메소드

//修改订单状态
    public function updateState($data){        if($data){
            $order_sn = $data[&#39;out_trade_no&#39;];\

            $data = array();
            $data[&#39;order_id&#39;] = $order_id;
            //修改订单状态(用curlpost方法请求至thinkphp目录下的Controller里面控制器里面的方法,修改状态)
            $url = &#39;www.test.com&#39;;
            header(&#39;content-type:text/html;charset=utf8&#39;);
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            $result = curl_exec($curl);
            curl_close($curl);            if($result == &#39;success&#39;){                return true;
            }else{                return false;
            }

        }
    }
로그인 후 복사

를 만든 다음

아래에 추가하는 것입니다. inform.php의
$notify = new PayNotifyCallBack();
$notify->Handle(false);
로그인 후 복사

//接受参数,修改状态
$xml = file_get_contents("php://input");
$data = json_decode(json_encode(simplexml_load_string($xml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);
$notify->updateState($data);
로그인 후 복사

相关推荐:

PHP后台接口的一些问题

5 分钟实现微信支付接入教程

php初学者如何学习实现微信支付和支付宝支付的相关教程

위 내용은 App WeChat Payment의 PHP 백그라운드 인터페이스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿