중화사전망 - 서예자전 - 위챗 빨간 봉투의 기술적 원리는 무엇입니까?
위챗 빨간 봉투의 기술적 원리는 무엇입니까?
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');
}