PHP 가 위 챗 H5 에 접속 하여 지불 하 는 방법 예시

개발 전 설정
코드 접속 을 하기 전에 위 챗 배경 에 도 메 인 이름 을 되 돌 릴 수 있 는 권한 을 부여 해 야 합 니 다.이 도 메 인 이름 은 반드시 ICP 를 거 쳐 등록 해 야 합 니 다.
개발 주요 절차
  • 사용자 가 주문 할 때 위 챗 결 제 를 선택한다
  • 업 체 가 업무 논리 처 리 를 하고 위 챗 을 호출 하여 주문 인 터 페 이 스 를 통일 시 킵 니 다.위 챗 H5 거래 유형 은 trade 입 니 다.type=MWEB
  • 다음 인 터 페 이 스 를 호출 하 는 데 성공 하면 위 챗 은 결제 점프 URL 등 관련 매개 변 수 를 되 돌려 주 고 업 체 는 매개 변 수 를 통 해 mweburl 지불 중간 페이지
  • 중간 페이지 위 챗 에서 H5 권한 검증
  • 결제 성공 시 위 챗 은 사업 자 에 게 비동기 결과 알림
  • 을 발송 합 니 다.
    정식 개발
    위 챗 결 제 를 조정 하고 필요 한 매개 변수 만 설명 합 니 다.
    위 챗 의 단일 인터페이스 통일 을 요청 합 니 다.인터페이스 주소:https://api.mch.weixin.qq.com/pay/unifiedorder
    인터페이스 요청 파라미터
  • appid:위 챗 공식 번호 iD
  • mch_id:계좌 번호
  • nonce_str:무 작위 문자열,32 비트 이상
  • sign:서명
  • body:상품 설명
  • out_trade_no:상점 주문 번호,32 위 이하
  • total_fee:총 금액,단위
  • spbill_create_ip:사용자 측 결제 요청 시 IP
  • notify_url:비동기 적 으로 주 소 를 되 돌 릴 수 있 습 니 다.주 소 를 직접 방문 할 수 있어 야 합 니 다.매개 변 수 를 휴대 할 수 없습니다
  • trade_type:거래 유형,예 를 들 어 H5 는 MWEB
  • 이상 은 H5 결제 주문서 에 필요 한 매개 변수 입 니 다.
    서명 생 성
  • 서명 생 성 에 참여 하 는 매개 변 수 는 비어 있어 야 합 니 다
  • 매개 변 수 는 ASCII 코드 에 따라 작은 것 에서 큰 것 으로 정렬 되 고 매개 변수 이름 은 대소 문자
  • 로 구분 된다.
  • 상기 규칙 에 따라 매개 변 수 를 k1=v1&k2=v2...과 같은 문자열
  • 로 연결 합 니 다.
  • 이전 단계 에서 얻 은 문자열 을 key 에 연결 합 니 다.예 를 들 어 k1=v1&k2=v2&key=192006250 b4c 09247 ec02e
  • 마지막 으로 받 은 문자열 을 MD5 로 암호 화하 고 대문자 로 전환 합 니 다.즉,최종 sign 값
  • 입 니 다.
    코드:
    
      /**
       *     
       * @param array $params     
       * @param string $key   
       */
      public function genSign($params, $key)
      {
        foreach ($params as $k=>$v) {
          if (!$v) {
            unset($params[$k]);
          }
        }
        ksort($params);
        $paramStr = '';
        foreach ($params as $k => $v) {
          $paramStr = $paramStr . $k . '=' . $v . '&';
        }
        $paramStr = $paramStr . 'key='.$key;
        $sign = strtoupper(md5($paramStr));
        return $sign;
      }
    
    요청 을 하 다
    매개 변 수 를 XML 데이터 로 변환 하면 요청 할 수 있 습 니 다.
    배열 을 XML 코드 로 변환:
    
      /**
       *      XML
       * @param array $params       
       */
      public function array_to_xml($params)
      {
        if(!is_array($params)|| count($params) <= 0) {
          return false;
        }
        $xml = "<xml>";
        foreach ($params as $key=>$val) {
          if (is_numeric($val)) {
            $xml.="<".$key.">".$val."</".$key.">";
          } else {
            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
          }
        }
        $xml.="</xml>";
        return $xml;
      }
    
    요청 코드:
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        $return = curl_exec($ch);
        curl_close($ch);
        return $return;
    
    위 챗 은 XML 데 이 터 를 되 돌려 줍 니 다.
    
    <xml><return_code><![CDATA[SUCCESS]]></return_code>
    <return_msg><![CDATA[OK]]></return_msg>
    <appid><![CDATA[wxdded766660f9b840]]></appid>
    <mch_id><![CDATA[1516216351]]></mch_id>
    <device_info><![CDATA[100]]></device_info>
    <nonce_str><![CDATA[2DUN2i2pGnlC6vDi]]></nonce_str>
    <sign><![CDATA[95CEA831D598299097A32D8FEEC6BDEF]]></sign>
    <result_code><![CDATA[SUCCESS]]></result_code>
    <prepay_id><![CDATA[wx22194530678545eb3713f2f10724143329]]></prepay_id>
    <trade_type><![CDATA[MWEB]]></trade_type>
    <mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx22194530678545eb3713f2f10724143329&package=87106983]]></mweb_url>
    return_code 는 SUCCESS 대표 에 게 지불 요청 이 성공 하 였 습 니 다.
    mweb_url 은 지불 을 위해 페이지 를 돌 립 니 다.이때 클 라 이언 트 는 mweb 을 통 해url 은 이미 위 챗 결 제 를 조정 할 수 있 습 니 다.
    중간 처리
    위 챗 을 받 고 돌아 오 는 mweburl 매개 변수 후 서버 에서 deepLink 를 더 얻 을 수 있 습 니 다.
    코드:
    
      /**
       *          deepLink  
       * @param string $url      mweb_url
       * @param string $ip    IP
       */
      public function getDeeplink(string $url, string $ip)
      {
        $headers = array("X-FORWARDED-FOR:$ip", "CLIENT-IP:$ip");
        ob_start();
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_HTTPHEADER , $headers );
        curl_setopt ($ch, CURLOPT_REFERER, "pay.o9di.cn");
        curl_setopt( $ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 6.0.1; OPPO R11s Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36');
        curl_exec($ch);
        curl_close ($ch);
        $out = ob_get_contents();
        ob_clean();
        $a = preg_match('/weixin:\/\/wap.*/',$out, $str);
        if ($a) {
          return substr($str[0], 0, strlen($str[0])-1);
        } else {
          return '';
        }
      }
    
    weixin://wap/pay?prepayid%3Dwx22201221074146ac747121890095299503&package=2656135616&noncestr=1542888966&sign=e31dbc2d1231708ff8a982b15a6c7646즉,얻 은 deepLink 값 을 위해 클 라 이언 트 도 이 값 을 통 해 직접 지불 할 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기