이전 섹션에서는 결제 페이지의 표시를 수행했습니다. 이전 섹션에 표시된 JSP 코드에서 사용자가 지불을 확인하기 위해 클릭하면 $ {shop} /pay_gobank.action의 조치 로 이동하는 것을 알 수 있습니다. 즉, 제출 한 후, 우리는 GoBank 메소드에서 지불 조치 (즉, 섹션 21 데모의 흐름도의 논리)의 논리를 처리해야합니다.
그러나 MVC 설계 패턴을 고려할 때 위의 비즈니스 로직을 처리를 위해 서비스 계층에 넣으므로 섹션 21에서 데모의 지불 로직을 구현하겠습니다.
1. 매개 변수를 캡슐화하기 위해 모델을 작성하십시오
우선, JSP 페이지에서 전송 된 매개 변수를 수신하려면 모델 (SendData)을 작성하고 직접 전송 해야하는 다른 매개 변수를 추가해야합니다. 이 매개 변수는 Yibao의 공식 문서에 규정되어 있습니다. 우리는 문서의 규정을 엄격히 따를 수 있습니다.
/ * * 쇼핑몰에서 Yibao 지불에 보낸 정보는 엔티티 */public class senddata를 구현할 수있는 {private static final long serialversionuid = -630410373907145812L; // (*)는 필수 필드 개인 문자열 P0_CMD를 나타냅니다. // 비즈니스 유형 (*), 고정 : 개인 문자열 구매 p1_merid; // Merchant Number (*) 개인 문자열 p2_order; // Merchant Order Number Private String P3_AMT; // 지불 금액 개인 문자열 p4_cur; // 거래 통화 (*) 개인 문자열 p5_pid; // 제품 유형 private string; // 제품 유형 p7_pdesc; P8_URL; // 상인이 지불 성공 데이터를 수신하기위한 주소 P9_SAF; // 전달 주소 개인 문자열 pa_mp; // 판매자 정보 개인 문자열 pd_frpid; // 결제 채널 인코딩, 즉 Bank private String pr_needResponse; // 응답 메커니즘 // 생략 및 세트 방법}위의 속성은 모두 Yibao로 전송 될 매개 변수입니다. 필요한 매개 변수를 선택할 수 있습니다. 그들 모두가 전송되는 것은 아닙니다. 상황에 따라, 우리는 일반적으로 p5, p6 및 p7을 제외하고 그것들을 전달합니다. 행동 강령을 살펴 보겠습니다.
2. 지불 구현
지불하면 주로 JSP 페이지에 전달 된 일부 매개 변수를 모델로 캡슐화 한 다음 서비스 계층 메소드를 호출하여 다음과 같이 다른 매개 변수를 초기화합니다.
@Controller ( "Payaction")@scope ( "프로토 타입") 공개 클래스 지불은 Baseection <bood> emparments ParameterAware {public String gobank () {// 1을 확장합니다. 완전한 매개 변수 : P2 P3 PD PA, Forder Forder = (Forder) Session.get ( "Oldforder")를 가져와야합니다. 사용자 user = (user) session.get ( "사용자"); model.setp2_order (forder.getId (). toString ()); // 가맹점 주문 번호 model.setp3_amt (forder.getTotal (). toString ()); // 결제 금액 model.setpa_mp (user.getEmail () + "," + user.getphone ()); // 가맹점 확장 정보 // 2. 매개 변수를 추가하십시오 // 3. 암호화 및 서명 // 4. 요청 도메인에 PayService.savedatatorequest (요청, 모델)를 저장합니다. // 2,3,4 비즈니스 로직은 처리를 위해 서비스 계층으로 넘겨집니다. 결제 페이지로 이동하면 "지불"; }}다음으로 서비스 계층의 코드를 작성해 봅시다. 서비스 계층은 주로 위의 2, 3 및 4 단계의 논리를 구현합니다.
3. 서비스 계층 구현
특정 코드는 다음과 같습니다.
// payservice 인터페이스 public interface payservice {// 요청 맵에 암호화 된 정보를 저장 공개 맵 <string, object> savedatatorequest (map <string, object> request, sendData sendData); // 반환 된 데이터를 암호화하여 암호 텍스트를 얻었고, 후퇴 한 암호 텍스트 (나중에 구현)와 비교합니다 (우리는 나중에 구현합니다) public boolean checkbackdata (backdata backdata);} // payserviceimpl 구현 클래스 @service ( "payservice") public classe payserviceimplle payserviceimplm payservice {// key @key @ky @key @key @key @Value ( "#{prop.p1_merid}") // mer 계정 (주문 번호가 아님) 개인 문자열 p1_merid; // 성공적인 지불에 대한 반환 주소 @Value ( "#{prop.p8_url}") 개인 문자열 p8_url; // 위의 세 가지 속성은 모두 고정 된 값입니다. Pay.Properties 구성 파일에 넣고 Spring Data의 데이터를 완료하기 위해 Spring Annotation @Value를 직접 사용하여 P2 P3 PD PA는 프론트 엔드 주입이며 여기에 채울 필요가 없습니다. 이미 개인 senddata finishsendData (sendData sendData) {sendData.setp0_cmd ( "buy")를 얻었습니다. senddata.setp1_merid (p1_merid); senddata.setp4_cur ( "cny"); senddata.setp5_pid ( ""); senddata.setp6_pcat ( ""); senddata.setp7_pdesc ( ""); senddata.setp8_url (p8_url); senddata.setp9_saf ( "0"); senddata.setpr_needResponse ( "0"); reture senddata; } // 데이터 추가를 완료하고 추가 된 일반 텍스트 개인 문자열 joinendDataparam (sendData sendData) {// 모든 데이터가 채워진 sendData = this.finishSendData (sendData); StringBuffer InfoBuffer = New StringBuffer (); infobuffer.append (senddata.getp0_cmd ()); infobuffer.append (senddata.getp1_merid ()); infobuffer.append (senddata.getp2_order ()); infobuffer.append (senddata.getp3_amt ()); infobuffer.append (senddata.getp4_cur ()); infobuffer.append (senddata.getp5_pid ()); infobuffer.append (senddata.getp6_pcat ()); infobuffer.append (senddata.getp7_pdesc ()); infobuffer.append (senddata.getp8_url ()); infobuffer.append (senddata.getp9_saf ()); infobuffer.append (sendData.getPa_mp ()); infobuffer.append (senddata.getpd_frpid ()); infobuffer.append (sendData.getPr_needResponse ()); return infobuffer.toString (); } // 암호화 된 정보를 requestmap @override public map <string, object> savedatatorequest (map <string, object> request, sendData sendData)에 저장합니다. {// 부가 될 문자열을 반환합니다 (예 : 일반 텍스트) String joinparam = joinsendDataparam (sendData); request.put ( "p0_cmd", senddata.getp0_cmd ()); request.put ( "p1_merid", senddata.getp1_merid ()); request.put ( "p2_order", senddata.getp2_order ()); request.put ( "p3_amt", senddata.getp3_amt ()); request.put ( "p4_cur", senddata.getp4_cur ()); request.put ( "p5_pid", senddata.getp5_pid ()); request.put ( "p6_pcat", senddata.getp6_pcat ()); request.put ( "p7_pdesc", senddata.getp7_pdesc ()); request.put ( "P8_URL", sendData.getp8_url ()); request.put ( "p9_saf", senddata.getp9_saf ()); request.put ( "pa_mp", senddata.getpa_mp ()); request.put ( "pd_frpid", senddata.getpd_frpid ()); request.put ( "pr_needResponse", sendData.getPr_needResponse ()); request.put ( "hmac", digestutil.hmacsign (joinparam, key)); // 서명 추가 (ciphertext) 반환 요청; }}구현 원리는 실제로 이전 데모의 서블릿과 동일하다는 것을 알 수 있습니다. 위의 코드는 Pay.Properties 파일 및 주석을 사용합니다. Pay.Properties 파일 및 beans.xml의 구성을 살펴 보겠습니다.
#pay.propertieskey = w0p75wmz203fr46r5i70v556wha94j14yw5j6vuh4yo3nrl5jsqf3c41677p1_merid = 1000940764P8_URL = https/: //www.hao123.com.
<!-beans.xml-> <bean id = "prop"> <property name = "locations"> <Array> <value> classPath : public.properties </value> <!-之前用到的-> <value> classPath : pay.properties </value> </value> </property> </bean>
좋아, 이제 동작 및 서비스 계층이 작성되었으므로 struts.xml 파일을 다시 구성합시다.
4. struts.xml 구성 및 pay.jsp 페이지
<action name = "pay_*"method = "{1}"> <결과 이름 = "pay">/user/pay.jsp </result> </action>struts.xml의 구성은 매우 간단합니다. 주로 반환 값에 따라 사용자/pay.jsp 페이지로 이동하고 위의 위에서 설정 한 일반 텍스트 (매개 변수) 및 ciphertext (서명)를 yibao 서버로 보냅니다.
<div> <span> 주문 번호 : </span> <strong> $ {requestscope.p2_order} </strong> <span> [지불 및 문의를 할 때 사용할 수 있도록이 번호를 기억하십시오. </span> <img src = "$ {shop} /files/yibao.jpg"/> </div> <div> <span> 지불 은행 : </span> <img src = "$ {shop}/files/bankimages/$ {pd_frpid} .gif".gif ".gif".gif ". action = 'https : //www.yeepay.com/app-merchant-proxy/node'method = 'post'target = "_ blank"> <입력 유형 = 'hidden'name = 'p0_cmd'value = '$ {requestscope.p0_cmd}'> input type = 'p1_merid' value = '$ {requestscope.p1_merid}'> <입력 유형 = 'hidden'name = 'p2_order'value = '$ {requestScope.p2_order}'> <입력 유형 = 'hidden'name = 'p2_order'value = '$ {requestScope.p2_order}'> <input type = 'p3_AMT' value = '$ {requestScope.p3_amt}'> <입력 유형 = 'hidden'name = 'p4_cur'value = '$ {requestScope.p4_cur}'> <입력 유형 = 'hidden'name = 'p5_pid'value = '$ {requestScope.p5_pid}'> value = '$ {requestScope.p6_pcat}'> <입력 유형 = 'hidden'name = 'p7_pdesc'value = '$ {requestScope.p7_pdesc}'> <입력 유형 = 'hidden'name = 'p8_url'value = '$ {requestScope.p8_url}'> input type = ''hiddecden ''same. value = '$ {requestScope.p9_saf}'> <input type = 'hidden'name = 'pa_mp'value = '$ {requestScope.pa_mp}'> <입력 유형 = 'hidden'name = 'pd_frpid'value = '$ {requestScope.pd_frpid}'> <input _ ""prot " value = "$ {requestscope.pr_needResponse}"> <입력 유형 = 'hidden'name = 'hmac'value = '$ {requestScope.hmac}'> <div> <입력 유형 = "value ="pay now "/> </div> </form> </div> Pay.jsp는 통과하려는 모든 일반 텍스트와 해당 암호 텍스트를 Yibao 서버로 보냅니다. Yibao는이 일반 텍스트를 기반으로 같은 방식으로 암호 텍스트로 암호화 한 다음 전송 한 암호 텍스트와 일치시킵니다. 동일한 경우 데이터가 안전하다는 것을 의미하는 경우 전송 프로세스 중에 변조되지 않으며 정상적으로 지불 페이지로 이동 한 다음 정상적인 결제를합니다. 동일하지 않은 경우 지불이 허용되지 않으며 친근한 프롬프트 페이지가 나타납니다.
이 시점에서 나는이 온라인 결제 프로세스에 대해 이미 명확하게 만들었습니다. 그 이유는 매우 간단합니다. 매개 변수를 함께 추가하여 형성하고 암호 텍스트를 생성하기 위해 암호를 추가 한 다음 이러한 매개 변수와 암호 텍스트를 제 3 자에게 전송하는 것 이상입니다. 그는 또한 동일한 암호화 방법으로 비밀번호를 추가하고 내가 보낸 것과 비교합니다. 은행 인터페이스를 호출하는 방법에 관해서는 우리가해야 할 일이 아닙니다. 이것은 일부 보안을 포함하여 제 3 자의 책임입니다. 모든 사람은 자신의 업무에 집중할 수 있습니다. 저는 제 3 자와 연결하고 그에게 유용한 정보를 전달하면됩니다. 제 3자는 다른 은행과 연결하는 방법에만 집중하면 개발에 큰 편의를 제공합니다. 다른 은행과 연결된 인터페이스는 확실히 다르기 때문입니다. 우리가 은행과 직접 연결하기 위해 비용이 너무 높고 유지 관리가 불편합니다. 은행이 업그레이드되면 제 3 자와 함께 업그레이드해야합니다. 우리는 그것에 대해 걱정할 필요가 없습니다. 업그레이드는 제 3 자의 문제이며 제 3 자와의 인터페이스는 변경되지 않습니다 ~
원본 링크 : http://blog.csdn.net/eson_15/article/details/51464415
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.