이 섹션에서는 먼저 Yibao 지불 프로세스를 테스트하기위한 간단한 데모를 작성합니다. 이 과정에 익숙해지면 실제 개발을 수행 할 것입니다. 데모이기 때문에 디자인 패턴을 고려하지 않고 결제 기능을 직접 구현했습니다. 지불 기능을 구현하려면 Yibao는 우리에게 제공된 API가 필요합니다. 따라서 문제는 타사 지불 플랫폼을 사용할 때 가장 중요한 것은 플랫폼의 API를 얻는 것입니다. 먼저 API 및 개발 문서를 얻은 다음 추가 개발을 수행 할 수 있습니다.
1. Yibao의 API를 얻으십시오
API를 얻는 첫 번째 단계는 Yibao에 계정을 등록하는 것입니다. 이 계정은 판매자의 계정입니다. 구매자가 지불 한 후에는 돈을 계좌에 입금하고 가맹점은 은행 카드에 직접 인출합니다. Yibao는 인출 과정에서 특정 취급 수수료를 청구합니다. 이것은 Yibao의 이익 모델입니다. 그러나 성공적인 등록을위한 전제 조건은 웹 사이트 또는 회사, Bara, Bara 등이 있어야한다는 것입니다. 어쨌든, 신청 자격이 있어야합니다. Yibao는이 점을 검토 할 것입니다. 만날 때만 등록하고 인터페이스를 제공 할 수 있습니다. 모든 사람이 등록 할 수있는 것은 아닙니다. 나는 그것을 등록한 다른 사람들뿐만 아니라 그것을 사용했지만 나 자신이 아무것도 없었습니다 ... 나는 등록 할 수 없었습니다 ... 나는 이것을 알고 있지만, 일반적으로 회사에서 개발할 때이 문제는 없습니다. 계정이 있어야합니다. 가장 중요한 것은 개발 프로세스 및 관련 기술을 마스터하는 것입니다.
2. 결제 프로세스를 테스트하십시오
공식 API 및 기술 문서를 사용하면 개발을 시작할 수 있습니다. 여기서 우리는 주로 Yibao 지불 과정을 테스트하기위한 간단한 데모를 작성합니다. 데모의 구조는 매우 간단하고 서블릿, 필터, 2 개의 JSP 페이지 및 암호화 된 도구 클래스입니다. Servlet은 Yibao Server 측면을 다룹니다. Yibao 인터페이스와 관련된 처리를 수행합니다. 필터는 가능한 중국의 문제를 해결하는 데 사용됩니다. 두 JSP 중 하나는 프론트 엔드 페이지입니다.
아래와 같이 먼저 지불 요청 프로세스를 분석하겠습니다.
자, 데모의 관련 코드를 자세히 분석하겠습니다.
2.1 프론트 데스크 테스트 페이지
먼저 프론트 데스크 페이지 index.jsp의 특정 코드를 살펴 보겠습니다.
<%@ page language = "java"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 Transitional // en"> <html> <head> <title> 프론트 오피스 홈 </title> </head> <h1 <h1> 온라인 지불 데모 </h1> < action = "$ {pagecontext.request.contextpath}/servlet/payservlet"method = "post">이 쇼핑의 주문 번호 <입력 유형 = "text"name = "p2_order"/> <br> money <input type = "text"name = "p3_amt"value = "0.01"/> industrial 및 상업 은행 <input type = "indraad =" "input type ="input plade = "input" 이름 = "PD_FRPID"> 건축 은행 <입력 유형 = "Radio"value = "CCB-Net"이름 = "PD_FRPID"> <br> <입력 유형 = "제출"value = "제출"/> <입력 유형 = "Hidden"value = "pay"name = "status"/> </body> </html>위의 JSP 페이지 에서이 입력 태그의 이름 속성 값이 매우 이상하고 PI_Function (i = 0,1,2,…, 9)이며 다른 값이 있음을 알 수 있습니다. 이를 위해서는 Yibao의 공식 문서를 언급해야합니다. 이 이름은 해당 속성을 나타내며 처리를 위해 Sevlet으로 전달됩니다. 이 속성 값과 관련하여 다음과 같이 그림이 있습니다.
이러한 매개 변수 이름 중 일부는 위에 쓰여진 주문 번호, 지불 비용이 얼마입니까? 주문이 확인되면 인수됩니다. 다른 매개 변수가 필요한 경우 서블릿에 지정해야합니다. 필드가 필요하지 않은 경우 비어있을 수 있습니다. 여기의 빈은 널가 아니지만 ""는 나중에 서블릿에서 언급 될 것입니다.
두 은행의 해당 값을 살펴 보겠습니다. Yibao는 지원하는 모든 은행의 가치 값을 제공합니다. 이들은 고정되어 있으며 수정할 수 없습니다. 다음은 효과를 테스트 할 두 개의 은행이 있습니다.
마지막 숨겨진 필드는 서블릿에서 판단하는 데 사용됩니다. 지불이 성공한 후에 지불금이든 반품이든, 아래의 Sevlet에 설명됩니다.
2.2 서블릿은 요청을 처리합니다
서블릿은 주로 Yibao와 관련된 요청을 처리합니다. 내용에는 두 부분이 있습니다. 한 부분은 평범한 텍스트와 암호 텍스트를 Yibao에게 보내는 것입니다. 다른 부분은 Yibao가 보낸 일반 텍스트와 암호 텍스트를 판단하는 것입니다. 데모의 특정 구현 코드를 살펴 보겠습니다.
Public Class PayServlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse response)를 servletexception, ioexception {string status = request.getParameter ( "status"); if (status.equals ( "pay")) {// index.jsp의 숨겨진 필드가 지불되므로 지불 부분이 처리됩니다. // 암호화 키는 암호화 알고리즘에 사용되며 지불 중개자가 제공합니다. 각 판매자는 고유 한 문자열 KeyValue = "W0P75WMZ203FR46R5I70V556WHA94J14YW5J6VUH4YO3NRL5JSQF3C41677"; // 1 : 값을 매개 변수에 할당합니다. 이 매개 변수 (예 : 일반 텍스트)는 Yibao가 제공 한 문서에 정의됩니다. 이름 문자열 p0_cmd = formatstring ( "buy")을 변경할 수 없습니다. 문자열 p1_merid = formatstring ( "100000940764"); 문자열 p2_order = formatstring (request.getParameter ( "p2_order")); 문자열 p3_amt = formatstring (request.getParameter ( "p3_amt")); 문자열 p4_cur = FormatString ( "CNY"); 문자열 p5_pid = ""; 문자열 p6_pcat = ""; 문자열 p7_pdesc = ""; 문자열 p8_URL = "http://www.tongji.edu.cn"; // 결제가 성공한 후에 점프하는 페이지입니다. 쇼핑몰의 홈페이지로 설정할 수 있습니다. 이 데모는 Tongji University 홈페이지를 사용하기에 충분합니다 ... String p9_saf = "0"; 문자열 pa_mp = ""; 문자열 pd_frpid = formatstring (request.getParameter ( "pd_frpid")); pd_frpid = pd_frpid.touppercase (); 문자열 pr_needResponse = "0"; 문자열 hmac = formatstring ( ""); // HMAC는 CipherText/*저장하는 데 사용됩니다. 위의 모든 일반 텍스트는 FormatString 메소드로 래핑됩니다. 이 방법은 다음과 같습니다. NULL을 주로 "" *로 변환 할 수 없기 때문에 NULL을 CipherText *// 데이터 보안 문제 해결 : 일반 텍스트를 암호화 한 다음 PlainText와 CipherText를 Yibao // yibao // yibao에 적용하고, 데이터를 가져오고, 전송 된 데이터와 동등한 데이터를 암호화 한 후에는 Cipher와 동등한 데이터를 가져옵니다. (가맹점과 Yibao는 암호화 할 때 동일한 키를 사용합니다) // 일반 텍스트 데이터를 StringBuffer에 추가하면, 추가 순서가 변경 될 수 없으며, 그렇지 않으면 생성 된 암호 텍스트가 다릅니다. // Yibao가 문서의 순서에 따라 추가되므로 Yibao의 공식 문서 이름에 따라 엄격하게 써야합니다. infobuffer = new StringBuffer (); InfoBuffer.Append (P0_CMD); infobuffer.append (p1_merid); infobuffer.append (p2_order); InfoBuffer.Append (P3_AMT); InfoBuffer.Append (P4_CUR); InfoBuffer.Append (P5_PID); InfoBuffer.Append (P6_PCAT); infobuffer.append (p7_pdesc); InfoBuffer.Append (P8_URL); InfoBuffer.Append (P9_SAF); InfoBuffer.Append (PA_MP); InfoBuffer.Append (PD_FRPID); infobuffer.append (pr_needResponse); // 암호화 된 암호 텍스트는 HMAC에 저장되며 암호화 알고리즘 Yibao는 동일한 알고리즘을 사용해야하기 때문에 제공합니다. // Plain Text와 Cipher Text를 request.setAttribute request.setAttribute ( "p0_cmd", p0_cmd)에 저장합니다. request.setattribute ( "p1_merid", p1_merid); request.setattribute ( "p2_order", p2_order); request.setattribute ( "p3_amt", p3_amt); request.setattribute ( "p4_cur", p4_cur); request.setattribute ( "p5_pid", p5_pid); request.setattribute ( "p6_pcat", p6_pcat); request.setattribute ( "p7_pdesc", p7_pdesc); request.setAttribute ( "p8_URL", p8_URL); request.setattribute ( "p9_saf", p9_saf); request.setattribute ( "pa_mp", pa_mp); request.setattribute ( "pd_frpid", pd_frpid); request.setattribute ( "pr_needResponse", pr_needResponse); request.setattribute ( "hmac", hmac); System.out.println ( "hmac->" + hmac); // reqpay.jsp로 건너 뛰고이 정보를 yibao request.getRequestDispatcher ( "/reqpay.jsp")에 제출합니다. } else if (status.equals ( "success")) {// yibao에서 오는 것은 성공입니다. 처리는 확인 부품 printwriter out = respons.getWriter (); 문자열 keyValue = "W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677"; // 모든 일반 텍스트 문자열 r0_cmd = formatstring (request.getParameter ( "r0_cmd")); 문자열 p1_merid = request.getParameter ( "p1_merid"); 문자열 r1_code = formatstring (request.getParameter ( "r1_code")); 문자열 r2_trxid = formatstring (request.getParameter ( "r2_trxid")); 문자열 r3_amt = formatstring (request.getParameter ( "r3_amt")); 문자열 r4_cur = FormatString (request.getParameter ( "r4_cur")); 문자열 r5_pid = new String (formatstring (request.getParameter ( "r5_pid")). getBytes ( "ISO-8859-1"), "UTF-8"); 문자열 r6_order = formatstring (request.getParameter ( "r6_order")); 문자열 r7_uid = formatstring (request.getParameter ( "r7_uid")); 문자열 r8_mp = new String (formatstring (request.getParameter ( "r8_mp")). getBytes ( "ISO-8859-1"), "UTF-8"); 문자열 r9_btype = formatstring (request.getParameter ( "r9_btype")); // 일반 텍스트 문자열 hmac = formatstring (request.getParameter ( "hmac"))에 데이터를 추가합니다. StringBuffer InfoBuffer = New StringBuffer (); infobuffer.append (p1_merid); InfoBuffer.Append (R0_CMD); infobuffer.append (r1_code); InfoBuffer.Append (R2_TrxID); InfoBuffer.Append (R3_AMT); InfoBuffer.Append (R4_CUR); InfoBuffer.Append (R5_PID); infobuffer.append (r6_order); InfoBuffer.Append (R7_UID); InfoBuffer.Append (R8_MP); InfoBuffer.Append (R9_BTYPE); // 반환 된 일반 텍스트 문자열 md5 = digestutil.hmacsign (infobuffer.toString (), keyValue); // 암호화 된 암호 텍스트가 전송 된 데이터 서명 부울 isok = md5.equals (hmac)와 동일인지 결정합니다. if (isok && r1_code.equals ( "1"))) {// r1_code는 성공을 나타내려면 1입니다. // 결제에 성공한 주문 상태를 변경하고 지불 성공 정보를 사용자에게 표시합니다. // 이메일 서비스 인터페이스, SMS 전송 서비스 등을 호출합니다. //print ~ out.println ( "주문 번호 :" + r6_order + "지불 금액 IS :" + r3_AMT); } else {out.println ( "실패 !!!"); }}} public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); } String formatstring (문자열 텍스트) {if (text == null) {return ""; } 리턴 텍스트; }}2.3 암호화 알고리즘
일반 텍스트를 Ciphertext로 변환하는 데 사용되는 암호화 알고리즘은 Yibao가 제공합니다. 일반 텍스트를 암호 텍스트로 변환하는 데만 사용하면됩니다. 알고리즘은 다음과 같습니다.
공개 클래스 digestutil {private static string encodingcharset = "utf-8"; public static String hmacsign (String avalue, String akey) {byte k_ipad [] = new Byte [64]; 바이트 k_opad [] = 새로운 바이트 [64]; 바이트 키브 []; 바이트 값 []; try {keyb = akey.getBytes (encodingcharset); value = avalue.getBytes (encodingcharset); } catch (UnsupportedEncodingException e) {keyb = akey.getBytes (); 값 = avalue.getBytes (); } arrays.fill (k_ipad, keyb.length, 64, (byte) 54); arrays.fill (k_opad, keyb.length, 64, (byte) 92); for (int i = 0; i <keyb.length; i ++) {k_ipad [i] = (byte) (keyb [i] ^ 0x36); k_opad [i] = (byte) (keyb [i] ^ 0x5c); } MessageDigest md = null; try {md = messageDigest.getInstance ( "md5"); } catch (nosuchalgorithmexception e) {return null; } md.update (k_ipad); md.update (값); 바이트 dg [] = md.digest (); md.reset (); md.update (k_opad); md.update (dg, 0, 16); dg = md.digest (); 반환 토 헥 (DG); } public static string tohex (byte input []) {if (input == null) return null; StringBuffer 출력 = New StringBuffer (input.length * 2); for (int i = 0; i <input.length; i ++) {int current = input [i] & 0xff; if (current <16) output.append ( "0"); output.append (integer.tostring (현재, 16)); } return output.toString (); } public static string gethmac (String [] args, String key) {if (args == null || args.length == 0) {return (null); } StringBuffer str = new StringBuffer (); for (int i = 0; i <args.length; i ++) {str.append (args [i]); } return (hmacsign (str.toString (), key); } / ** * @param avalue * @return * / public static string digest (String avalue) {avalue = avalue.trim (); 바이트 값 []; try {value = avalue.getBytes (encodingcharset); } catch (UnSupportedEncodingException e) {value = avalue.getBytes (); } MessageDigest md = null; try {md = messagedigest.getInstance ( "sha"); } catch (nosuchalgorithmexception e) {e.printstacktrace (); 널 리턴; } return toHex (md.Digest (value)); } // public static void main (String [] args) {// 매개 변수 1 : PlainText (암호화 될 데이터) 매개 변수 2 : key System.out.println (digestutil.hmacsign ( "11111", "ABC")); System.out.println (digestutil.hmacsign ( "11111", "abd")); // 데이터 보안 문제 해결 : 일반 텍스트를 암호화합니다 ---> 비밀 텍스트와 평원 텍스트를 Yibao // yibao가 데이터를 가져 오면 전송 된 일반 텍스트를 암호화하고 전송 된 암호 텍스트와 비교하십시오. 동등한 데이터가 변조되지 않은 경우 (상인과 Yibao는 암호화 할 때 동일한 키를 사용합니다)}}암호화 알고리즘을 너무 많이 연구하지 않았습니다. 2 세대 MD5 암호화 알고리즘 인 것 같습니다. 어쨌든, 평범한 텍스트를 던지면 암호 텍스트로 암호화됩니다. reqpay.jsp 페이지를 살펴 보겠습니다.
<%@page language = "java"contmenttype = "text/html; charset = gbk"%> <html> <head> <title> to yeepay page </title> </head> <body> <form name = "yeepay"action = 'https : //www.yeepay.com/app-proxy/node'방법 = ''https : 'https : //www.yeepay.com/node' type = 'hidden'name = 'p0_cmd'value = '$ {requestScope.p0_cmd}'> <입력 유형 = 'hidden'name = 'p1_merid'value = '$ {requestScope.p1_merid}'> <입력 유형 = 'hidden'name = 'p2_order'{requestScope.p2_Order. type = 'hidden'name = 'p3_amt'value = '$ {requestScope.p3_amt}'> <입력 유형 = 'hidden'name = 'p4_cur'value = '$ {requestScope.p4_cur}'> <입력 유형 = 'hidden'name = 'p5_pid ='$ {intos.p5_pid} type = 'hidden'name = 'p6_pcat'value = '$ {requestScope.p6_pcat}'> <input type = 'hidden'name = 'p7_pdesc'value = '$ {requestScope.p7_pdesc}'> <input type = 'hidden'name = 'p8_url'{intscope. type = 'hidden'name = 'p9_saf'value = '$ {requestScope.p9_saf}'> <입력 유형 = 'hidden'name = 'pa_mp'value = '$ {requestScope.pa_mp}'> <input type = 'hidden'name = 'pa_mp'value = '$ {inutscope.pa_mp}'> type = 'hidden'name = 'pa_mp'value = '$ {requestScope.pa_mp}'> <입력 유형 = 'hidden'name = 'pd_frpid'value = '$ {requestScope.pd_frpid}'> <input type = "hidden"name = "pr_needResponse"> requestScope. <입력 유형 = 'hidden'name = 'hmac'value = '$ {requestScope.hmac}'> <입력 유형 = '제출'/> </form> </body> </html> 실제로이 페이지는 매우 간단합니다. <form> 양식을 통해 일반 텍스트와 암호 텍스트를 Yibao에게 전달하는 것입니다. Yibao의 수신 URL은 https://www.yeepay.com/app-merchant-proxy/node 입니다. 이것은 또한 Yibao 공무원이 제공 하며이 글을 쓸 수 있습니다. 실제로 submit 버튼 만 있습니다. submit 버튼을 클릭하여 일반 텍스트 및 암호 텍스트를 제출하십시오. 테스트 결과를 살펴 보겠습니다.
3. 시험 결제 결과
간단한 테스트 프론트 데스크 index.jsp ~~~ :
제출 후 ReqPay 및 JSP로 이동합니다. 제출 버튼을 클릭 한 후 효과는 다음과 같습니다. ICBC와 CCB를 모두 테스트합니다.
결제 절차에는 문제가 없습니다. 원래 결제가 완료된 후 결과를 확인하기 위해 ICBC에 1 센트를 지불 할 계획 이었지만 USHIELD가 Alipay를 사용하는 것이 더 편리하기 때문에 만료되었다는 것을 알았습니다 ... U-Shield를 업데이트하지는 않았지만 ICBC를 통해 e-payment를 열었으므로 위의 인터페이스에서 e-payment를 사용하여 1 센트를 지불 할 수 있습니다. 결과는 다음과 같습니다.
그런 다음 이전에 지정한 페이지로 이동합니다.
이 섹션은 주로 간단한 데모를 통해 테스트하여 은행의 지불 인터페이스에 연결할 수 있는지 확인합니다. 이제 테스트는 괜찮습니다. 연결되어 있으며 평소와 같이 지불 할 수 있습니다. 간단한 데모를 소개하겠습니다. 그런 다음 이전 온라인 쇼핑몰 프로젝트의 온라인 결제 모듈을 계속 개발할 것입니다.
원본 주소 : http://blog.csdn.net/eson_15/article/details/51447492
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.