1. 온라인 결제 개요
온라인 결제 란 무엇입니까? 맞습니다. 온라인으로 돈을 쓰는 것입니다! 누구나 그런 경험을했을 것입니다. 그러나 온라인 결제의 "내부 이야기"에 대해 많이 알지 못할 수도 있습니다. 아래에서 배우자!
전자 상거래 웹 사이트를 지금 실행하기 시작하면 사용자가 물건을 구매하면 지불해야합니다. 귀하의 웹 사이트는 주요 은행에 연결할 수 있어야합니다. 그런 다음 결제가 완료된 후 웹 사이트로 돌아가서 "지불 성공"을 표시하십시오!
이것이 오늘 우리가 할 일입니다. 은행의 온라인 뱅킹 시스템에 연결하여 지불을 완료하십시오. 보다 전문적으로, 우리는 그것을 "온라인 결제를위한 게이트웨이 개발"이라고 부릅니다.
2. 온라인으로 지불하는 두 가지 방법
온라인으로 지불하는 두 가지 방법이 있습니다.
*전자 상거래는 은행과 직접 연결됩니다
*전자 상거래는 타사 지불 플랫폼을 통해 은행과 연결됩니다
전자 상거래는 은행의 동의가 필요한 은행과 직접 연결되지만 불행히도 은행은 매우 "굉장한"것이며 그들과 연결하고 싶은 사람은 아닙니다. 전자 상거래 사업이 일일 자본 흐름이 크면 고객이 전자 상거래에 지불 한 모든 돈이 은행 계좌에 입금되기 때문에 은행은 귀하와 연결됩니다! 그러나 자본 흐름이 작 으면 은행은 당신에게주의를 기울이지 않을 것입니다!
소규모 웹 사이트가 자금이 충분하지 않고 은행과 연결할 수 없으면 타사 지불 회사와 협력하도록 선택합니다. 또한 Alipay, Yibao, Fortune, Kuaiqian 및 기타 회사와 같은 회사가 중국에서는 상대적으로 유명합니다. 이 회사는 은행과 연결할 수 있으며 (자금이 충분하기 때문에) 소규모 전자 상거래 회사는 이들과 연결할 수 있습니다! 그러나 제 3자는 수수료가 필요합니다! 제 3자는 일반적으로 전자 상거래 수수료의 1%를 청구하지만 고객의 돈을 청구하지는 않습니다.
위의 그림을 통해 쇼핑몰 이름, RMB 주문 번호 및 주문 시간이 은행 페이지에 표시 될 것임을 알 수 있습니다. . . , 은행은 이러한 것들에 대해 어떻게 알고 있습니까? 물론 전자 상거래에 의해 은행에 전달됩니다. 전자 상거래 회사가 은행과 연결 한 후 전자 상거래 회사는 은행 페이지에서 필요한 매개 변수를 은행 페이지로 전달해야하므로 은행 페이지에 이러한 데이터를 표시 할 수 있습니다!
그러나 우리 쇼핑몰은 하나의 은행에만 연결할 수 없습니다! 우리는 BOC, CCB, ABC 및 ICBC의 4 개 회사와 연결해야합니다! 서로 다른 은행에 필요한 도킹 매개 변수는 다릅니다. 즉, 개발 중에 다른 은행에 대해 다른 도킹 코드를 작성해야합니다. 이것은 또한 은행과 직접 연결하는 단점입니다! 물론, 은행과의 직접적인 연결도 유리합니다. 즉, 보안이 필요하지 않으며 취급 수수료가 없습니다!
다른 은행에 대해 다른 코드를 개발합니다 (단점).
안전 (장점);
취급 수수료 없음 (장점);
소규모 전자 상거래 은행은 연결을 허용하지 않습니다 (단점).
위 그림과 같이, 고객이 전자 상거래 웹 사이트에서 지불을 확인하기 위해 클릭 한 후, 그는 제 3 자 웹 사이트로 향하는 다음 제 3자가 은행과 연결됩니다. 이것은 전자 상거래가 매개 변수를 타사에게 전달해야 함을 보여줍니다! 그런 다음 제 3자는 매개 변수를 은행에 전달합니다. 이 방법의 장점은 각 은행에 매개 변수를 제공하지 않고 제 3자를 위해 만 개발되면됩니다. 각 은행에 매개 변수를 제공하는 것은 타사 작업입니다. 그러나 제 3자가 오래되고 신뢰할 수 없다면, 제 3자가 파산하고 사람들이 도망 가면 돈이 사라질 것입니다. 고객이 지불 한 돈은 은행 계좌로 가지 않기 때문에 제 3 자의 은행 계좌에 지불되며 귀하는 제 3 자에 대한 계좌가 있습니다. 또한, 제 3자는 또한 핸들링 수수료 (일반적으로 1%)를 청구하며 이는 적은 수가 아닙니다 (실제로 나쁘다).
3. 타사 온라인 결제 규칙을 통해
전자 상거래가 제 3 자와 상인을 등록하려면 제 3 자에게 ICP 인증을 제공해야합니다. ICP 비즈니스 라이센스는 국가 "인터넷 관리 조치"에 따라 비즈니스 웹 사이트에서 처리 해야하는 웹 사이트 비즈니스 라이센스입니다. 그렇지 않은 경우 운영하는 것은 불법입니다.
연습 때문에 ICP를 신청할 수 없습니다! 따라서 우리는 제 3 자와 상인을 등록 할 수 없습니다. 그러나 우리는 이미 Yibao에 등록 된 기성품 판매자가 있으므로이 단계를 무시할 수 있습니다.
Yibao에 성공적으로 등록하면 Yibao는 다음과 같은 사항을 제공합니다.
Yibao (예 : 판매자 코드) : 10001126856에서 계정을 엽니 다
Yibao 액세스 사양 : CHM 파일 대칭 암호화 알고리즘 클래스 : PaymentUtil.java
키 : 69CL522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
Yibao Access 사양에서는 Yibao의 결제 게이트웨이를 찾을 수 있습니다. 실제로 URL, yibao와 연결하는 데 사용되는 URL : https://www.yeepay.com/app-merchant-proxy/node
Yibao 액세스 사양에서 Yibao가 요구하는 매개 변수도 찾을 수 있습니다. 전자 상거래가 Yibao와 연결되면 이러한 매개 변수를 지불 게이트웨이로 전달해야합니다.
공식 요청 주소 : https://www.yeepay.com/app-merchant-proxy/node
이 매개 변수는 URL에 추가되어야합니다.
그러나 이러한 매개 변수의 값을 암호화해야합니다. 암호화 키와 암호화 알고리즘 Yibao가 제공합니다!
여기서 P8_URL은 결제가 성공할 때 어떤 페이지로 돌아갈 것인지를 나타냅니다. 즉, 결과를 표시하는 페이지를 작성해야합니다. 결제가 성공하면 제 3자가 지정한 반환 페이지로 리디렉션되며 몇 가지 매개 변수도 제공합니다. 당사 페이지는 이러한 매개 변수를 얻고 페이지에 표시해야합니다. 다음은 제 3자가 반환 한 매개 변수입니다.
4. 타사 온라인 결제 시스템을 개발하십시오
단계:
index.jsp 페이지 : BuyserVlet에 제출 된 양식. 양식 항목에는 다음이 포함됩니다 : 주문 번호, 지불 금액, 은행 선택
BUYSERVLET : 양식 데이터를 얻고 타사 게이트웨이에 연결할 준비를합니다. Index.jsp 페이지에 3 개의 매개 변수 만 주어지고 제 3자가 요구하는 많은 매개 변수가 있으므로 페이지에서 제공하지 않은 매개 변수는 Buyservlet에 의해 보완됩니다. 그리고 매개 변수도 암호화해야하며 Buysesvlet에서 완료해야합니다.
Backservlet : 사용자가 성공적으로 지불하면 제 3자가 지정한 반환 페이지로 리디렉션됩니다. Backservlet을 반환 페이지로 사용합니다.이 페이지는 제 3자가 전달한 매개 변수를 수신하고 페이지에 표시하는 데 사용됩니다.
우리는 이미 Yibao에 등록 된 사업을하고 있기 때문에 스스로 사업을 등록 할 필요가 없습니다. 따라서 Yibao를 테스트를위한 타사 지불 플랫폼으로 사용하는 것이 있습니다. 전자 상거래 (ICP 인증을 통과 해야하는 전자 상거래)가 없기 때문에 제 3 자와 비즈니스를 등록 할 수 없습니다.
우리가 지금 사용하고있는 Yibao 사업은 Yibao의 Baba Sports Network에서 등록한 비즈니스 인 Chuanzhi Podcast에서 제공합니다. 따라서 시험 중에 지불 한 돈은 Yibao의 Baba Sports Network가 등록한 회사에 제공되었습니다.
1 단계 : index.jsp
<form action = ""method = "post"> 주문 번호 : <입력 유형 = "text"name = "p2_order"/> <br/> 금액 : <입력 유형 = "text"name = "p3_amt"/<br/> 은행 선택 : <입력 유형 = "pd_frpid"value = "icbc-net-b2c"/> 중국어 은행 및 상업용 은행. src = "bank_img/icbc.bmp"align = "middle"/> <input type = "radio"name = "pd_frpid"value = "boc-net-b2c"/> 중국 은행 <img src = "bank_img/icbc.bmp"align = "middle"/> <input type = "Radio"pd_frpid " value = "boc-net-b2c"/> 중국 은행 <img src = "bank_img/bc.bmp"align = "middle"/> <br/> <input type = "radio"name = "pd_frpid"value = "abc-net-b2c"/> 중국의 농업 은행 <img src = "all" ""al. type = "radio"name = "pd_frpid"value = "ccb-net-b2c"/> 건설 은행 <img src = "bank_img/ccb.bmp"align = "middle"/> <br/> <입력 유형 = "radio"name = "pd_frpid"value = "boco-net-b2c"/> src = "bank_img/bcc.bmp"align = "middle"/> <br/> <입력 유형 = "제출"value = "지불 확인"/> </form>
각 은행의 해당 가치 :
2 단계 : buyservlet.java
Public Class Buyservlet는 httpservlet {public void dopost (httpservletrequest 요청, httpservletrepsonse 응답)를 servletexception, ioexception {request.setcharacterencoding ( "UTF-8"); Response.setContentType ( "Text/Html; charset = utf-8"); 문자열 p0_cmd = "buy"; // 비즈니스 유형, 고정 값, 고정 값은 구매입니다. 트랜잭션 통화, 고정 값은 CNY이며 RMB 문자열 p5_pid = ""; // 제품 이름 문자열 p6_pcat = ""; // 제품 이름 문자열 p7_pdesc = ""; // 제품 설명 p8_url = "http : // localhost : 8080/buy/backservlet"; "http : // localhost : 8080/buy/backservlet"; // 전자 상거래의 반환 페이지, 지불이 성공할 때, Yibao는이 페이지로 리디렉션됩니다. String p9_saf = ""; // 배달 주소 pa_mp = "; // 제품 익스텐션 문자열 pd_frpid = request ("pd_frpid "; 문자열 pr_needResponse = "1"; // 응답 메커니즘, 고정 값은 1 // 키입니다. 문자열 keyvalue = "69cl522av6q613ii4w6u8k6xuw8vm1n6bfgyv769220iuye9u37n4y7ri4pl"; // 위 매개 변수, 키 및 암호화 알고리즘을 통해 HMAC 값이 생성됩니다. // 매개 변수 순서가 필요합니다. 값이 없으면 NULL은 제공 할 수 없지만 빈 문자열을 제공해야합니다. 문자열 hmac = paymentutil.buildhmac (p0_cmd, p1_merid, p2_order, p3_amt, p4_cur, p5_pid, p6_pcat, p7_pdesc, p8_url, p9_saf, pa_mp, pd_frpid, pr_needRespronge); // 모든 매개 변수를 게이트웨이 주소에 연결 문자열 url = "https://www.yeepay.com/app-merchant-proxy/node"; url + = "? p0_cmd =" + p0_cmd + "& p1_merid =" + p1_merid + "& p2_order =" + p2_order + "& p3_amt =" + p3_amt + "& p4_cur =" + p4_cur + "& p5_pid =" + p5_pid + " + p6_p cat =" + p5_pid "& p7_pdesc =" + p7_pdesc = " + p7_pdesc +"& p8_url = " + p8_URL =" + p8_URL + "& p9_SAF =" + p9_SAF + "& pa_mp =" + pa_mp + "& pd_frpid =" + pd_frpid + " + pa_mp +" + pd_frpid + " + pa_mp +" + pd_frpid + "& hmac =" + hmac; System.out.println (URL); // 게이트웨이 응답으로 리디렉션 .sendRedirect (URL); }}3 단계 : Backservlet
Public Class Backservlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse response)를 throws {respone.setContentType ( "text/html; charset = utf-8"); / * * yibao는 일련의 결과 매개 변수를 제공합니다. 우리는 필요한 것을 얻을 수 있습니다 * 지불 결과를 얻으십시오. R1_Code, 1은 지불이 성공했음을 의미합니다. * 지불 금액 받기 : R3_AMT * 전자 상거래 주문 번호 가져 오기 : R6_ORDER * 결과 반환 유형 : R9_BTYPE, 1은 리디렉션 리턴을 의미합니다. */ string r1_code = request.getParameter ( "r1_code"); 문자열 r3_amt = request.getParameter ( "r3_amt"); 문자열 r6_order = request.getParameter ( "r6_order"); 문자열 r9_btype = request.getParameter ( "r9_btype"); if (r1_code.equals ( "1")) {if (r9_btype.equals ( "1")) {response.getwriter (). print ( "<h1> 성공적으로 지불! </h1>"); // // yibao는이 서브 라이터로 돌아 오지 않습니다. "<br/"); response.getWriter (). print ( "주문 번호는" + r6_order + "<br/>"); }}}}Yibao 지불이 제공하는 HMAC를 얻기위한 도구
public class paymentUtil {private static string encodingcharset = "utf-8"; /*** HMAC 메서드 생성** @param p0_cmd 비즈니스 유형* @param p1_merid 판매자 번호* @param p2_order 판매자 주문 번호* @param p3_amt 지불 금액* @param p4_cur 거래 통화* @param p5_pid 제품 이름* @param p6_pcat 제품 유형* @param p8 @param product the 가맹점 수신 지불 성공 데이터* @param p9_saf 배달 주소* @param pa_mp 판매자 확장 정보* @param pd_frpid 뱅크 코드* @param pr_needresponse 응답 메커니즘* @param keyvalue merchant 키*/ public static string buildhmac (문자열 p0_cmd, 문자열 p1_merid, 문자열 p2_amt, 문자열 p3_amt, string. P4_CUR, String P5_PID, String P6_PCAT, String P7_PDESC, String P8_URL, String P9_SAF, String PA_MP, String PD_FRPID, String PR_NEEDRESPONSE, String KeyValue) {StringBuilder Svalue = New StringBuilder (); // 비즈니스 유형 svalue.append (p0_cmd); // 판매자 번호 svalue.append (p1_merid); // 가맹점 주문 번호 svalue.append (p2_order); // 지불 금액 svalue.append (p3_amt); // 거래 통화 svalue.append (p4_cur); // 제품 이름 svalue.append (p5_pid); // 제품 유형 svalue.append (p6_pcat); // 제품 설명 svalue.append (p7_pdesc); // 상인의 주소 수신 지불 성공 데이터 svalue.append (p8_url); // 배달 주소 svalue.append (p9_saf); // 가맹점 확장 정보 svalue.append (pa_mp); // 은행 코드 svalue.append (pd_frpid); // 응답 메커니즘 svalue.append (pr_needResponse); return paymentUtil.hmacsign (svalue.toString (), keyValue); } /*** 확인 hmac 메서드** @param hmac 결제 게이트웨이에 의해 보낸 암호화 검증 코드* @param p1_merid 판매자 번호* @param r0_cmd 비즈니스 유형* @param r1_code 지불 결과* @param r2_trxid yibao 지불 거래 번호* @param r3_amt 금액* @param r4 r4 r4 r4 r4 r4 r4 r4 r R5_PID 제품 이름* @param r6_order 판매자 주문 번호* @param r7_uid yibao 지불 멤버 ID* @param r8_mp 판매자 확장 정보* @param r9_btype 거래 결과 반환 유형* @param keyvalue key* @return*/ public static bolean verifycallback (string p1mmerid, string r0_cmd, string). r1_code, 문자열 R2_trxID, 문자열 R3_AMT, 문자열 R4_CUR, String R5_PID, String R6_Order, String R7_UID, String R8_MP, String R9_BType, String KeyValue) {StringBuilder Svalue = New StringBuilder (); // 판매자 번호 svalue.append (p1_merid); // 비즈니스 유형 svalue.append (r0_cmd); // 지불 결과 svalue.append (r1_code); // yibao 지불 거래 번호 svalue.append (r2_trxid); // 지불 금액 svalue.append (r3_amt); // 트랜잭션 통화 svalue.append (r4_cur); // 제품 이름 svalue.append (r5_pid); // 판매자 주문 번호 svalue.append (r6_order); // yibao 지불 멤버 id svalue.append (r7_uid); // 가맹점 확장 정보 svalue.append (r8_mp); // 트랜잭션 결과 반환 유형 svalue.append (r9_btype); 문자열 snewstring = paymentUtil.hmacsign (svalue.toString (), keyValue); 반환 snewstring.equals (HMAC); } / ** * @param avalue * @param akey * @return * / 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 (); } / ** * * @param args * @param key * @return * / 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) {// System.out.println (hmacsign ( "annulcard1000043252120080160450.0http : //localhost/szxpro/callback.asp 海? 4 56486826473332444648682654733324511 ","8upp0KE8SQ73ZVP370VKO7C39403RTK1YWX40TD6IRH216036H27EB12792T "); // }}Yibao 콜백
피어 투 피어 : Yibao는 전자 상거래에 직접 액세스하며 여기에는 클라이언트가 없습니다.
이 방법은 꼭 사용해야하며 이런 식으로받을 수 없습니다! 고정 IP가 없기 때문에
Yibao는 재설정 메커니즘을 가지고 있습니다. 그것이 당신을 방문하고 당신이 메시지를 돌려 보내지 않으면, 그것은 계속 재현 할 것입니다!
전자 상거래는 성공을 시작으로 문자열을 반환해야합니다!
클라이언트 브라우저가 전자 상거래로 리디렉션하도록 안내하십시오. 고객이 전자 상거래에 액세스하도록하는 것입니다!
사용할 수 없습니다!
HMAC : 13 매개 변수 값 + 키 value (키) + 알고리즘 (MD5)
13 매개 변수 값 : 혼자서 설정!
KeyValue : Yibao가 우리가 등록한 후 우리에게 보냈습니다. 우리와 Yibao 만이이 일에 대해 알고있었습니다!
HMAC를 반환하는 기본 MD5 : PaymentUtil.buildhmac (14)가있는 알고리즘
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.