1 : 초기 Wechat 지불 문해력 지식
전제 조건은 이미 WeChat 지불 기능을 신청 한 공식 계정이 있으며 공식 계정 AppID 및 WeChat 판매자 계정을 얻어야한다는 것입니다. 이것은 각각 WeChat 공식 계정 및 WeChat 지불 판매자 플랫폼에서 찾을 수 있습니다. 실제로 지불 기능을 성공적으로 신청 한 후 WeChat은 이메일을 통해 메일을 전달합니다. 이 정보를 사용하면 WeChat 지불 서비스 지원 페이지 (https://pay.weixin.qq.com/service_provider/index.shtml로 이동할 수 있습니다.
이 페이지를 열고 오른쪽 상단에있는 링크 [개발 문서]를 클릭하여 API 문서 설명 페이지를 입력하십시오.
적색 원을 선택하여 지불 할 코드를 스캔하므로 액세스 방법을 수행해야합니다. 마우스를 위로 옮기고 개발 문서를 보도록 프롬프트하십시오. 이것을 보는 방법을 모른다면 샤워를하고 잠자리에들 수 있습니다. 당신은 프로그래머에게는 실제로 적합하지 않습니다. 주소는 다음과 같습니다.
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 브라우저에서 열린 후 볼 수 있습니다
우리가 집중하고 읽은 내용에는 이미 빨간 타원이 표시되어 있습니다. 먼저 [인터페이스 규칙]의 프로토콜 사양을 읽으십시오. 농담,이 글을 읽지 않으면 wechat 결제를 원합니다. 이것은 당신이 여자를 데리러 가고 싶은 것과 같습니다. 기본 배경 정보를 먼저 수집하고 상대방의 특성을 이해해야합니다. 그렇지 않으면 아래에서 어떻게 전달할 수 있습니까? 여자를 데리러 갈 수있는 프로그래머만이 좋은 영업 사원입니다. 주제를 벗어난 후 [Scene 소개]의 사례와 사양을 살펴 보겠습니다. Wechat Pay의 로고를보십시오. 이것은 마침내 우리 자신의 QR 코드 지불 웹 페이지에 넣는 것입니다. 그 후, [모드 2]에 중점을 둡니다.
여기서는 PC 페이지 스캔 코드 결제 기능을 실현하기 위해 Mode 2 메소드를 사용합니다.
"Mode 2의 공식 설명은 다음과 같습니다."판매자 백엔드 시스템은 WeChat Pay의 통합 단일 인터페이스를 먼저 호출하고, WeChat 백엔드 시스템은 링크 매개 변수 Code_url을 반환하고, 가맹점 백엔드 시스템은 Code_url 값으로 QR 코드 사진을 생성하고 Code _UTIONT를 시작할 수 없으며, Code _URL의 초래가 될 수 없습니다. 지불." 이해한다면 먼저 weChat에 전화를 걸어 통합 단일 인터페이스를 제공하고 주요 정보 Code_URL을 가져와야합니다 (이 Code_URL이 무엇인지, 모르겠습니다). 그런 다음 우리 자신의 프로그램을 통해 QR 코드를 생성합니다. 여기에서 Google의 Zxing 라이브러리를 사용합니다. 그런 다음 PC 웹 페이지에 QR 코드를 표시하십시오. 이러한 방식으로 터미널 사용자는 코드를 스캔하여 지불하며 결제가 완료됩니다. 당신은 이것을 보게되어 매우 기쁩니다. WeChat 결제가 매우 간단하다는 것을 알게됩니다. 우리가 아직 모르는 또 다른 것이 있습니다. 고객은 자신이 지불했다는 것을 알고 있지만 서버 측은 아직 모릅니다. WeChat 개발자의 IQ와 함께이 문제를 오랫동안 생각했습니다. 따라서 통합 단일 인터페이스를 호출하면 콜백 URL 인 필요한 매개 변수가 있습니다. 즉, 클라이언트가 성공적으로 지불하면 WeChat 은이 URL을 통해 일부 데이터를 자체 서버에 제출 한 다음 백그라운드에서 데이터를 구문 분석하여 자체 작업을 완료합니다. 그래야만 고객이 WeChat을 통해 실제로 지불했는지 알 수 있습니다. 이런 식으로 전체 프로세스가 끝났으며 패턴 2입니다. WeChat 은이 프로세스를 나타내는 타이밍 다이어그램을 사용합니다.
표현하기가 복잡하고 어려운 것 같습니다. 요약하면, 서버가해야 할 일은 다음과 같습니다.
1. 통합 단일 인터페이스를 통해 올바른 매개 변수 (물론 콜백 URL)와 서명 검증을 전달하고 반환 데이터에서 Code_URL의 해당 데이터를 가져옵니다.
2. Code_url 데이터를 기반으로 QR 코드 이미지를 생성하여 브라우저 웹 페이지에 표시합니다.
3. 콜백의 URL에 우리 자신의 비즈니스 로직 처리를 추가하십시오.
문해력은 이제 끝났으며 마침내 코드를 스캔하여 어떤 종류의 비용을 지불 해야하는지 알 수 있습니다. 관련 API 사용량을 살펴보고 모든 단계를 처리하는 데 좋은 작업을 수행합시다.
둘 : 개발 과정
코드를 개발하기 전에 먼저 몇 가지를 준비하십시오.
1. ZXing의 Maven 의존성을 추가하십시오
2. Jdom의 Maven 의존성을 추가하십시오
3. Java 버전 SDK 데모 프로그램 다운로드, 주소는 여기에 있습니다.
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
md5util.java 및 xmlutil.java 두 파일이 필요합니다
4. 우리는 httpclient 버전 4.5.1을 사용하고 Maven 종속성을 추가하는 것을 잊지 마십시오.
위의 준비가 완료되면 계속 읽으십시오.
먼저 WeChat의 통합 단일 인터페이스를 호출해야합니다. [API 목록]의 통합 단일을 클릭하면 다음과 같은 페이지가 표시됩니다.
내 전화의 실제 상황을 예로 들어 다음 매개 변수가 필요합니다. 모든 사람의 편의를 위해, 나는 그것을 포조 객체로 바꿨습니다. 코드는 다음과 같습니다.
공개 클래스 UnifiedOrderDto는 weixinconstants {private String appid; private String body; private String device_info; private String mch_id; private String notify_url; private string; private string out_trade_no; private spbill_create_ip; private string sign;); {this.appid = appid; this.mch_id = wxpaymentaccount; this.device_info = device_info_web; this.notify_url = callback_url; this.trade_type = trade_type_native;} public string getAppid ({return applid;} public appid =) appid;} public string getbody () {return body;} public void setbody (문자열 body) {this.body = body;} public string getDevice_info () {return device_info;} public void setdevice_info (string device_info) {this.device_info = device_info;} public string getmch_id (getmch_id) mch_id;} public void setmch_id (String mch_id) {this.mch_id = mch_id;} public string getNonce_str () {return nonce_str;} public void setnonce_str (string nonce_str) {this.nonce_str = nonce_str; setNotify_url (String notify_url) {this.notify_url = notify_url;} public string getOpenid () {return openID;} public void setOpenid (string openid) {this.openid = openid;} public void void setout_no;} public setout_no; out_trade_no) {this.out_trade_no = out_trade_no;} public string getspbill_create_ip () {return spbill_create_ip;} public void setspbill_create_ip (string spbill_create_ip) {this.spbill_create_ip = spbill_create _create _create _create _create. getTotal_fee () {return total_fee;} public void settotal_fee (int total_fee) {this.total_fee = total_fee;} public string gettrade_type () {return arver_type;} public void settrade_type (String trade_type) {thistade _trade _trade _type =} {return sign;} public void setSign (문자열 부호) {this.sign = sign;} public string getProduct_id () {return product_id;} public void setProduct_id (String product_id) {this.product_id;} public string generatexmlcontent () {String xml = "< + this. "</appid>" + "" + this. this.body + "" + "<device_info> 웹 </device_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nonce_str>"<notify_url> " + this.noTly_Url + "</notify_url>" + "<out_trade_no>" + this.out_trade_no + "</out_trade_no>" + "<product_id>" + this.product_id + "</product_id>" + "<spbill_create_ip>" + this. this. this.spbill_create_ip + " + "<tatle_fee>" + string.valueof (this.total_fee) + "</total_fee>" + "<brade_type>" + this.trade_type + "</trade_type>" + "<sign>" + this.sign + "</sign>" + "</xml>"} {string xml; this.appid + "& body =" + this. th리. "& spbill_create_ip =" + this.spbill_create_ip + "& total_fee =" + string.valueof (this.total_fee) + "& trade_type =" + this.trade_type; content = content + "& key =" + weixinconstants.md5_api_key; string signation = weixInpayInpayInpayInpayInpayInPayInPayInpEnpee = " + string.valueof (this.total_fee) +"& trade_type = " + this.trade_type; "utf-8"); return signature.toupperCase ();}}각 멤버 변수에 대한 설명은 [Unified Single Interface]에 대한 설명에서 찾을 수 있습니다.
그런 다음 설정 한 내용을 작성하고 인터페이스를 호출하여 리턴 데이터를 가져오고 Code_URL 데이터를 가져오고이를 기반으로 2 차원 사진을 생성하고 이미지 주소를 PC 웹 페이지에 반환 한 다음 표시됩니다. 여기서 우리는 WeChat 결제를 클릭하면 AJAX 메소드를 통해 자신의 백엔드 SpringMVC 컨트롤러를 호출 한 다음 컨트롤러의 해당 메소드에서 HTTPCLIENT를 통해 weCHAT의 통합 단일 인터페이스 분석을 완료하여 Code_URL에서 반환 한 XML 데이터를 얻고 QR 코드를 생성하고 첫 페이지로 돌아갑니다. 컨트롤러에서 구현 된 코드는 다음과 같습니다.
map <string, object> result = new Hashmap <string, object> (); unifiedOrderDto dto = new UnifiedOrderDto (); if (cash == null || "".Equals (cash)) {result.put ( "error", "cash won n't Zero"); return int totalfee = 100*intger.parseint (cash); totalfee); dto.setProduct_id (string.valueof (System.CurrentTimeMillis ()); 식별 플래그 dto.setout_trade_no ( "주문 번호 + 키 정보는 weChat 콜백 후에 다시 전송됩니다. dto.makesign ()); logger.info ( "xml content :" + dto.generatexmlcontent ()); try {httpclient httpclient = httpclientBuilder.create (). build (); httppost post = new httppost (weixinconstants.unifiedorder_url); post.addheader ( "content-type", "text/xml; charset = utf-8"); 엄격함 xmlentity = new Stramentity (dto.generatexmlcontent (dto.generatexxmlcontent (dto.generatexxmlcontent), contenttype.text_xml); post.setentity (xmlentity); httpresponse httpresponse = httpclient.execute (post); string responsexml = entityutils.toString (httpresponse.getentity (), "utf-8"); code_url contentmap <string, string = ""> resultmap = (map <string, string = "">) xmlutil.doxmlparse (responsxml); logger.info ( "응답 code_url :" + resultmap.get ( "code_url")); String CodeUrl = resultMap.get ( "code_url"); !QR 코드를 생성하는 코드는 다음과 같습니다.
private String generateqrcode (string codeurl) {file folder = new File (basepath + "qrcode"); if (! folller.exists ()) {foldler.mkdirs ();} string f_name = uuidutil.uuid () + ".png"; rasepath (filepath + "qrcode); fio = new fileoutputStream (f); multiformatwriter multiformatwriter = new multiformatwriter (); map hints = new Hashmap (); hints.put (encodehinttype.character_set, "utf-8"); // 문자 세트를 인코딩 유형 bitmatrix bitmatrix = null; bitmatrix = multiformatwriter.encode (codeurl, barcodeformat.qr_code, 300, 300, hints); BufferedImage Image = TobufferedImage (bitmatrix); // output qr code imageio.write (image, ", fio); ( "qrcode/" + f_name);} catch (예외 e1) {e1.printstacktrace (); return null;}}현재 클라이언트에서 WeChat QR 코드를 스캔 한 후 콜백을 사용하여 URL을 만들고 데이터를 반환합니다. 콜백 메소드에서 자체 처리를 완료 할 것입니다. 여기서는 콜백 인터페이스를 HTTP Post 메소드를 통해 구현해야한다는 점에 유의해야합니다. 그렇지 않으면 XML 데이터가 허용되지 않습니다. 콜백 처리 코드는 다음과 같습니다.
} new Hashmap <string, string = ""> (); inputStream inputStream = requestStream = request.getInputStream (); // 입력 스트림 saxBuilder = new SaxBuilder (); document docut 목록 = root.getchildren (); iterator it = list.iterator (); while (it.hasnext ()) {요소 e = (요소) it.next (); String k = e.getName (); String v = ""; list children = e.getChildren (); if (childs.isempty ()) {v = e.getTextNormaiLa (e.getTextNmaiLaiLaiLaiLaiallaiS (); xmlutil.getchildrentext (children);} resultmap.put (k, v);} // 서명을 확인하십시오! ! ! /*string [] keys = resultMap.keyset (). ToArray (새 문자열 [0]); arrays.sort (keys); string kvparams = "; for (int i = 0; i <keys.length; i ++) =" "{=" "if [i] .equals ("sign ")). if (i = "="0) = "kvparams =" " + ="(키 [i] "" ""= " + resultmap.get (keys [i]); weixinpaymentutil.md5encode (eSign, "utf-8"); = ""if (! md5esign.equals ( "sign")) = ""return; = ""}*= ""free resource = "inputstream.close ()"inputstresm = ""string = " returnCode = "Return_Code" OutTradeno); = ""logger.info ( "total_fee =" "nfee); =" "" "비즈니스 처리 프로세스 =" "if ("success ".equals (returnCode)) =" "todo : =" "your =" "business =" "process ="add = ""here = "". response.getWriter (). print (xmlutil.getRestresultxml (resultmap.get ( "return_code"), = ""resultmap.get ( "return_code"))); = ""else = "" "resultmap.get ("return_msg ")))); (jdomexception = ""e1) = ""e1.printstacktrace (); = "" "}WeChat 데모의 공식 Java 버전에 사용되는 두 가지 클래스의 Xmlutil과 Md5util을 사용해야합니다. 데모 코드는 공식 데모 페이지에서 찾을 수 있습니다. 관련 Maven 의존성은 다음과 같습니다.
<pectionency> <groupid> jdom </groupid> jdom </artifactid> <bersion> 1.1 </version> </dependency> <pectomency> <groupid> com.google.zxing </groupid> core </artifactid> <bersion> 3.3.0 </version> </dependency>
마지막으로 서명에 특별한주의를 기울여야합니다. 공식 WeChat 웹 사이트에서 Demo 프로그램의 Java 버전을 직접 다운로드하여 서명을 얻었습니다. MD5 서명이 일관되도록하기위한 최선의 선택이기 때문에 동일한 작업을 수행하는 것이 좋습니다. 서명을 생성하기위한 특정 알고리즘의 경우 공식 WeChat 문서를 볼 수 있습니다. 여기서는 공식 API를 설명해야합니다. 개발 중에 발생하는 다양한 문제의 90%는 공식 문서를 읽지 않고 누군가의 블로그를 신뢰하기 때문입니다! 이것은이 기사를 쓰는 나의 진정한 목적과 목적입니다. 공식 문서에 따르면 Java 코드로 구현했습니다. WeChat PC 웹 페이지에서 QR 코드를 스캔하면 웹 응용 프로그램에서 결제 비용이 확실히 비행 할 것입니다.
위는 PC 웹 페이지의 Java SpringMVC 구현입니다. WeChat QR Code Payment (정식 버전)는 편집기가 소개합니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!