최근 에이 프로젝트는 WeChat 지불이 필요하며 WeChat 공식 계정 지불을 살펴 보았습니다. 어렵지는 않지만 세부 사항은 여전히주의를 기울여야합니다. 나는 하루 종일 데모를 쓰고 지불 프로세스를 완전히 테스트했습니다. 아래에서 WeChat 공식 계정 지불의 경험을 공유해 봅시다.
1. 공식 계정 wechat 결제 구성
WeChat 공식 계정 지불 주소를 구성하고 화이트리스트를 테스트해야합니다.
예를 들어, 지불 js 페이지의 주소는 http://www.xxx.com/shop/pay/입니다.
그런 다음 여기에 구성된 www.xxx.com/shop/pay/가 있습니다.
2. 개발 과정
API (주소 http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_4)를 지불하기 위해 WeChat 공식 계정을 빌리십시오. 다음과 같이 :
3. WeChat 서버로 주문하십시오
Unified 단일 인터페이스에 전화하여 WeChat 결제의 선불을 얻을 수 있도록하십시오 (http://pay.weixin.qq.com/wiki/doc/api/index.php?capter=9_1).
이 인터페이스를 호출하기 전에 H5 지불을 위해 채워야하는 OpenID 인 여러 분야가 있습니다.
3.1 OpenID를 얻으십시오
웹 권한 부여 양식 (http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)을 사용할 수 있습니다.
WeChat에서 다음 링크를 보내십시오
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=url&response_type=code&scope=snsapi_base&state=12333300_Redirect
3.2 prepay_id를 얻으려면 순서를 배치하십시오
코드는 다음과 같습니다. 실제로 WeChat 서버에서 전송 된 prepay_id를 얻기 위해 Post를 통해 XML 파일을 보내는 것입니다.
import java.io.bytearrayinputstream; JavaioioException 가져 오기; JavaioInputStream 가져 오기; JavaiounsupportedencodingException 가져 오기; Javautildate 수입; Javautilhashmap 가져 오기; Javautiliterator 수입; Javautilmap 가져 오기; Javautilmapentry 가져 오기; Javautilrandom 수입; javaxservlethtttttpservletrequest 가져 오기; javaxservlethtttttpservletresponse 가져 오기; orgapachecommonscodecdigestDigestutils 가져 오기; orgspringframeworkstereotypecontroller 가져 오기; orgspringframeworkwebbindannotationRequestMapping import; orgxmlpullvxmlpullparser import; 가져 오기 orgxmlpullvxmlpullparserexception; orgxmlpullvxmlpullparserfactory import; comfasterxmljacksondatabindjsonnode 가져 오기; comgsonoauthoauth 수입; comgsonoauthpay 가져 오기; comgsonutilhttpkit 가져 오기; ComyUtildateTimeUtil 수입; Comyutiljsonutil 수입; @controller @requestmapping ( "/pay") 공개 클래스 wxpaycontroller {@requestmapping (value = "wxprepaydo") public void jspay (httpservletrequest request, httpservletresponse 응답, 문자열 콜백) 예외 {// sessionId = sessionUtilggetS "); if (OpenID == null) {OpenID = getUseroPenid (요청); } 문자열 appid = "WX16691FCB0523C1A4"; 문자열 paternerkey = "iningfeng1234567fdfwfdfdfd1sss234567"; String out_trade_no = getTradeno (); map <string, string> paramap = new Hashmap <String, String> (); paramapput ( "appid", appid); paramapput ( "첨부", "테스트"); ParamApput ( "Body", "Test Pubue Payment"); paramapput ( "mch_id", "10283271"); paramapput ( "nonce_str", create_nonce_str ()); ParamApput ( "OpenID", OpenID); paramapput ( "out_trade_no", out_trade_no); paramapput ( "spbill_create_ip", getAddrip (request)); paramapput ( "Total_fee", "1"); paramapput ( "trade_type", "jsapi"); paramapput ( "notify_url", "http : // wwwxxxco/bank/page/wxnotify"); 문자열 부호 = getSign (paramap, paternerkey); paramapput ( "표시", 부호); // Unified Order https : // apimchweixinqqcom/pay/unifiedorder string url = "https : // apimchweixinqqcom/pay/unifiedorder"; 문자열 xml = arraytoxml (paramap); 문자열 xmlstr = httpkitpost (url, xml); // 선불 제품 ID String prepay_id = ""; if (xmlstrindexof ( "success")! = -1) {map <string, string> map = doxmlparse (xmlstr); prepay_id = (문자열) mapget ( "pleray_id"); } map <String, String> PayMap = new Hashmap <String, String> (); PayMapput ( "appid", appid); PayMapput ( "timestamp", create_timestamp ()); PayMapput ( "noncest", create_nonce_str ()); PayMapput ( "signtype", "md5"); PayMapput ( "패키지", "prepay_id =" + prepay_id); 문자열 paysign = getSign (PayMap, PaternerKey); paymapput ( "pg", repay_id); PayMapput ( "PaySign", PaySign); WebUtilResponse (응답, WebutilPackjsonp (콜백, JSONUTILWARPJSONNODERSPONSE (JSONUTILOBJECTTOJSONNODE (PAYMAP)) TOSTRING ()); } / ** * XML에지도 * * @param arr * @return * / public String arraytoxml (map <string, String> arr) {String xml = "<xml>"; iterator <eptry <string, String >> iter = arrentryset () iterator (); while (iterhasnext ()) {entry <string, string> entry = iternext (); 문자열 key = EntryGetKey (); String val = EntryGetValue (); xml + = "<" + key + ">" + val + "</" + key + ">"; } xml += "</xml>"; XML을 반환합니다. } // get get get get openID private string getUserOpenid (httpservletRequest 요청) 예외 {문자열 코드 = requestGetParameter ( "code"); if (code == null) {String OpenID = requestGetParameter ( "OpenID"); OpenId 리턴; } oauth o = new Oauth (); 문자열 토큰 = oogettoken (코드); JSONNODE 노드 = JSONUTILSTRINGTOJSONNODE (토큰); String OpenID = Nodeget ( "OpenID") astext (); OpenId 리턴; } 개인 문자열 create_nonce_str () {문자열 chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789"; 문자열 res = ""; for (int i = 0; i <16; i ++) {random rd = new random (); res += charscharat (rdnextint (charslength () -1)); } return res; } private string getAddRip (httpservletRequest 요청) {return requestGetRemoteaddr (); } private String create_timestamp () {return longtoString (SystemCurrentTimeMillis () / 1000); } private String getTradEno () {String timestamp = dateTeMeUtilformatDate (new Date (), dateTeMeUtildAteTime_pattern); "hzno" + 타임 스탬프를 반환합니다. } private string getSign (map <string, string> params, String paternerkey)는 unsupportedencodingexception {String String1 = paycreatesign (params, false); 문자열 stringsigntemp = String1 + "& key =" + paternerkey; 문자열 signValue = digestutilsmd5hex (stringsigntemp) touppercase (); SignValue를 반환합니다. } private map <string, string> doxmlparse (String XML)는 XMLPULLPARSEREXCEPTION, iOException {inputStream inputStream = new ByTeArrayInputStream (xmlgetBytes ()); map <string, String> map = null; xmlpullparser pullparser = xmlpullparserfactorynewinstance () newpullparser (); PullParsersetInput (InputStream, "UTF-8"); // XML int eventType = pullParsErgetEventType ()에 대해 구문 분석 할 XML 데이터를 설정합니다. while (eventType! = XMLPULLPARSEREND_DOCUMENT) {switch (eventType) {case XMLPULLPARSERSTRART_DOCUMENT : map = new Hashmap <String, String> (); 부서지다; CASE XMLPULLPARSERSTRART_TAG : String key = PullParserGetName (); if (keyequals ( "xml") break; 문자열 값 = pullparsernextText (); Maput (키, 값); 부서지다; 사례 XMLPULLPARSEREND_TAG : BREAK; } eventType = pullParSernext (); } 리턴 맵; }}4. H5 지불
H5 결제는 실제로 매우 간단합니다. WeChat Embedded Browser의 JS 메소드 만 호출하면됩니다 (http://pay.weixin.qq.com/wiki/api/index.php?chapter=7_7).
<%@ page language = "java"contenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <%@ taglib prefix = "spring"uri = "http : // String BasePath = requestGetScheme () + ": //" + requestGetServerName () + ":" + requestGetServerPort () + path + "/"; %> <! doctype html public "-// w3c // dtd html 01 전환 // en" "http : // wwworg/tr/html4/loosedtd"> <html> <head> <meta charset = "utf-8"/> <meta name = "viewport"= "Device-Width, 초기, meta port" 최대 스케일 = 0, user-scalable = 0 " /> <meta name ="apple-mobile-web-app-capable "content ="yes " /> <meta name ="apple-mobile-web-app-status-bar 스타일 "내용 ="black " /<meta name ="Apple-mobile-web-app-status-bar-style " /> <meta name =" " />>>. content = "전화 = 아니오"/> <title> 테스트 결제 </title> <link href = "/css/csss? v = 0"rel = "Stylesheet"type = "text/css"> </head> <div> <div> wechat JS 결제 </div> <div> <ul> <li> <li> </li> </li> </li> </li> </li> </li> </li> </li> </li> </li> </li> </li> </li> </li> </li> </li> href = "javaScript : pay ();"> pay now </a> </a> </p> </div> </div> <script type = "text/javaScript"src = "/js/zeptominjs"> </script> <script type = "text/javascript"src = "/js/commonjs"> </javascript "> appid = urlparameter ( "appid"); var timestamp = urlparameter ( "타임 스탬프"); var noncestr = urlParameter ( "noncest"); var pg = urlparameter ( "pg"); var signtype = urlparameter ( "signtype"); var paysign = urlparameter ( "paysign"); function onbridgeready () {weixinjsbridgeinvoke ( 'getBrandwcpayRequest', { "appid": appid, // 공식 계정의 이름, "timestamp": // timeStamp, // timeStamp, 1970 년 이후의 초 수, // 임의의 Strink " SignType, // WeChat 서명 방법 : "PaySign": PaySign // weChat 서명}, function (res) {alert (alert}) { "성공"). 성공적이지만, 그것이 절대적으로 신뢰할 수 있다고 보장하지는 않습니다. } function pay () {if (typeof weixinjsbridge == "undefined") {if (documentAddeventListener) {documentAdDeventListener ( 'weixinjsbridGeready', onbridGeready, false); } else if (DocumentAtCevent) {DocumentAtCevent ( 'weixinjsbridgeready', onbridgeready); DocumentAtTachevent ( 'onweixinjsbridgeready', onbridgeready); }} else {onbridgeready (); }} </script> </body> </html> 효과는 다음과 같습니다
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.