중화사전망 - 서예자전 - 위챗 빨간 봉투의 기술적 원리는 무엇입니까?

위챗 빨간 봉투의 기술적 원리는 무엇입니까?

Wxapi 클래스 {

Private $ app _ id =' wxxxxxxxxxxxxxxx'; //공용 계정 appid, 먼저 일치하는 공용 계정을 신청하세요.

Private $ app _ secret =' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //위챗 공식 계정은 기밀이 아니며 사용자는 사용자 인증 토큰을 얻습니다.

Private $ app _ mchid =' xxxxxxxx'; //거래처 번호 id

함수 _ _ construct(){

//여기서 어떤 일을 하다 ....

}

/* *

* 위챗 지불

* @param string $openid 사용자 OpenID

*/

공용 역량 지불 ($re_openid)

{

Include _ once ('wxhongbaohelper.php');

$ commonutil = newcommonutil ();

$ wxhongbaohelper = new wxhongbaohelper ();

$ wxHongBaoHelper-& gt;; Setparameter ("nonce _ str", $ this-& gt;; Great _ rand()););

//32 비트보다 긴 임의 문자열.

$ wxHongBaoHelper-& gt;;

Setparameter ("mch _ billno", $ this-& gt;; App _ mchid.date ('ymdhis') 입니다. 랜드 (1000,9999);

//주문 번호

$ wxHongBaoHelper-& gt;; Setparameter ("mch _ id", $ this-& gt;; App _ mchid); //마케팅 담당자 번호

$ wxHongBaoHelper-& gt;; Setparameter ("wxappid", $ this-& gt;; App _ id);

$ wxHongBaoHelper-& gt;; SetParameter ("별명", "빨간 봉투"); //공급자 이름

$ wxHongBaoHelper-& gt;; Set parameter(“send _ name ","빨간 봉투 "); //빨간 봉투 보낸 사람의 이름

$ wxHongBaoHelper-& gt;; Setparameter ("re _ OpenID", $ re _ OpenID ",$ re _ OpenID); //의료 맥박 통신과 관련된 OpenID

$ wxHongBaoHelper-& gt;; Setparameter ("total _ amount",100); //지불 금액 (분)

$ wxHongBaoHelper-& gt;; Setparameter ("min _ value",100); //최소 빨간 봉투 금액, 단위 포인트

$ wxHongBaoHelper-& gt;; Setparameter ("max _ value",100); //최대 빨간 봉투 금액, 단위 포인트.

$ wxHongBaoHelper-& gt;; Setparameter ("total _ num",1); //빨간 봉투를 넣은 총 인원 수.

$ wxHongBaoHelper-& gt;; Set Parameter ("Wishing", "빨간 봉투 발급 행사에 참여해 주셔서 감사합니다. 새해 복 많이 받으세요!" " );

//빨간 봉투 축복

$ wxHongBaoHelper-& gt;; Setparameter ("client _ IP", "127.0.0.1"); //인터페이스를 호출하는 시스템의 Ip 주소입니다

$ wxHongBaoHelper-& gt;; Set parameter(“act _ name ","빨간 봉투 활동 "); //Live 이름

$ wxHongBaoHelper-& gt;; Set parameter(“remark ")," 와서 잡아라! ); //주석 정보

$ postxml = $ wxhongbaohelper-> Create _ 빨간 봉투 _ XML ();

$ URL ='/mmpaymkttransfers/sendredpack';

$ responsexml = $ wxhongbaohelper-> Curl _ post _ SSL($ URL, $ postxml);

//결과 디버그 출력으로 사용

//echo html entities ($ responsexml, ENT_COMPAT,' utf-8');

$ responseobj = SimpleXML _ load _ string ($ responsexml, SimpleXMLElement, libxml _ nocdata);

Return $ response obj-& gt;; Return _ 코드;

}

무작위 문자열 사각형을 가져옵니다

1

2

셋;삼;3

다섯;오;5

여섯;육

일곱

여덟;팔

아홉;구;9

10

1 1

/* *

* 난수 생성

*/

공용 함수 great _ rand(){

$ str ='1234567890 abcdefghijklmnopqrstuvwxyz';

For($ I = 0;; $ I & lt30; $ i++){

$ j = 랜드 (0,35);

$t 1 입니다. = $ str [$ j];

}

Return $ t1;

}

서명 알고리즘

1

2

셋;삼;3

다섯;오;5

여섯;육

일곱

여덟;팔

아홉;구;9

10

1 1

12

13

14

15

16

17

18

19

20

2 1

22

23

24

25

26

27

28

29

30

3 1

32

33

34

35

36

/* *

예를 들면 다음과 같습니다.

Appid: wxd111665abv58f4f

Mch_id: 10000 100

디바이스 정보: 1000

본체: 테스트

Nonce_str: ibuaiVcKdpRxkhJA

1: 다음과 같이 key=value 의 형식과 매개변수 이름의 ASCII 사전 순서에 따라 매개변수를 정렬합니다.

Stringa = "appid = wxd930ea 5d5a258f4f & Body = 테스트 및 테스트. 디바이스 정보 =1000 & Mch_i

D= 10000 100. Nonce _ str = ibuaivckdprxkhja ";

2 단계: 접합 지불 키:

String sign temp =“string a & amp;; Key =192006250 b4c09247 ec02 edce 69f 6a 2d "

Sign = MD5(stringsigtemp) 입니다. ToUpperCase ()

= "9a0a8659f005d6984697e2ca0a9cf3b7"

*/

보호된 함수 get _ sign(){

Define ('partner key',' qsrxxxxxxxxxxxxxxxxxxxxxxx“);');

시도 {

If (null = = partner key | "= = partner key) {

Thrownewsdkruntimiexception ("키는 비워 둘 수 없습니다! ". "& ltbr>);

}

If ($ this-> Check _ sign _ parameters () = = false) {//생성된 서명 매개변수 확인.

Thrownewsdkruntimiexception ("생성된 서명 매개 변수가 없습니다! ". "& ltbr>);

}

$ commonutil = newcommonutil ();

Ksort ($ this-> 매개 변수);

$ unsignparastring = $ commonutil-> Formatqueryparamap ($ this-> 매개 변수, false);

$ md5signutil = new md5signutil ();

Return $ m D5 signutil-& gt;;

기호 ($unSignParaString, $ commonutil-> Trimstring (partner key));

} catch(SDKRuntimeException $ e)

{

Die ($ e-"; Errormessage ());

}

}

CURL 이 인증서를 요청하고 보냅니다.

1

2

셋;삼;3

다섯;오;5

여섯;육

일곱

여덟;팔

아홉;구;9

10

1 1

12

13

14

15

16

17

18

19

20

2 1

22

23

24

25

26

27

28

29

30

3 1

32

33

34

35

함수 curl _ post _ SSL($ URL, $vars, $second=30, $aHeader=array ())

{

$ ch = curl _ init ();

//시간 초과

Curl _ setopt($ ch, CURLOPT_TIMEOUT, $ second);

Curl _ setopt($ ch, CURLOPT_RETURNTRANSFER,1);

//여기에 프록시를 설정합니다 (있는 경우).

Curl _ setopt($ ch, CURLOPT_URL, $ URL);

Curl _ setopt($ ch, CURLOPT_SSL_VERIFYPEER, false);

Curl _ setopt($ ch, CURLOPT_SSL_VERIFYHOST, false);

//인증서와 키는 두 가지입니다. Pem 파일.

//사용 중인 libcurl 버전이 7.20. 1 보다 높은 양방향 인증을 지원하는지 확인하십시오.

Curl _ setopt($ ch, CURLOPT_SSLCERT, dirname(_ _ FILE _ _). 디렉토리 _ 구분 기호.

정서'. 디렉토리 _ 구분 기호. Apiclient _ cert.pem');

Curl _ setopt($ ch, CURLOPT_SSLKEY, dirname(_ _ FILE _ _). 디렉토리 _ 구분 기호.

정서'. 디렉토리 _ 구분 기호. Api client _ key.pem');

Curl _ setopt($ ch, CURLOPT_CAINFO, dirname(_ _ FILE _ _). 디렉토리 _ 구분 기호.

정서'. 디렉토리 _ 구분 기호. Rootca.pem');

If (count ($ a header) > = 1 ){

Curl _ setopt($ ch, curlopt _ http 헤더, $ a 헤더);

}

Curl _ setopt($ ch, CURLOPT_POST,1);

Curl _ setopt($ ch, CURLOPT_POSTFIELDS, $ vars);

$ data = curl _ exec ($ ch);

If($ data ){

Curl _ close ($ ch);

$ data 를 반환합니다

}

그렇지 않으면 {

$ error = curl _ errno ($ ch);

//echo "호출이 실패했습니다. 오류 코드: $ error \ n";

Curl _ close ($ ch);

False 를 반환합니다

}

}

포털 파일

1

2

셋;삼;3

다섯;오;5

여섯;육

일곱

여덟;팔

아홉;구;9

10

1 1

12

13

14

15

16

17

18

19

@ require "pay.php";

//사용자 정보 얻기

$ get = $ _ get ['param'];

$ code = $ _ get ['code'];

//코드가 있는지 확인합니다.

If ($ get = =' access _ token' & & amp! 비어 있음 ($ code)){

$ param ['param'] =' access _ token';

$ param ['code'] = $ code;

$ packet = newpacket ();

//사용자 OpenID 정보 가져오기

$ userinfo = $ packet-& gt;; _ route ('userinfo', $ param);

If (empty ($ userinfo ['OpenID']) {

종료 ("아니요 auth");

}

//이체 결제 방법

$ packet-& gt;; _ route(‘wx packet‘', array ('OpenID' = > $ userinfo ['OpenID']);

} 그렇지 않으면 {

$ packet-& gt;; _ route ('userinfo');

}