В предыдущем разделе мы сделали отображение страницы оплаты. Из кода JSP, отображаемого в предыдущем разделе, мы видим, что когда пользователь нажимает, чтобы подтвердить оплату, он поднимет действие $ {shop} /pay_gobank.action . То есть, после подачи заявки, мы должны обработать некоторую логику в методе Гобанка в платежении (то есть логике блок -схемы в демо -демоверсии раздела 21), то есть получить простой текст, зашифруя простой текст в подпись (шифровый текст), а затем посетите сервер Yibao, Yibao соединяет банк, чтобы завершить оплату.
Однако, учитывая модель проектирования MVC, мы поместим вышеуказанную бизнес -логику в уровень обслуживания для обработки, поэтому давайте внедрим логику платежей демо в разделе 21.
1. Напишите модель, чтобы инкапсулировать параметры
Прежде всего, нам нужно написать модель (SendData), чтобы получить параметры, передаваемые со страницы JSP, и добавить другие параметры, которые необходимо отправлять нами. Эти параметры предусмотрены в официальных документах Yibao. Мы можем строго следовать правилам документов:
/ * * Информация, отправленная торговом центром в Yibao, инкапсулируется как объект * */public Class SendData реализует Serializable {Private Static Long Long Serialversionuid = -6304103739907145812L; // (*) Указывает требуемое поле частное строку P0_cmd; //Business type (*), fixed as: Buy private String p1_MerId;//Merchant number (*) private String p2_Order;//Merchant order number private String p3_Amt;//Payment amount private String p4_Cur;//Trading currency (*) private String p5_Pid;//Product name private String p6_Pcat;//Product type private String p7_Pdesc;//Product description private String P8_URL; // адрес для торговцев для получения данных о успехе платежа частная строка P9_SAF; // Адрес доставки частной строки PA_MP; // Информация о расширении продавцаВсе приведенные выше атрибуты представляют собой параметры, которые должны быть переданы на Yibao. Вы можете выбрать необходимые вам параметры. Не все из них передаются. В зависимости от ситуации, мы обычно передаем их, кроме P5, P6 и P7. Давайте посмотрим на код действия:
2. реализация оплаты
В Payaction мы в основном инкапсулируем некоторые параметры, передаваемые на странице JSP в модель, а затем вызовут метод уровня службы для инициализации других параметров следующим образом:
@Controller ("Payaction")@scope ("Prototype") Общедоступный класс Payaction расширяет базовый <Object> ParameteraWare {public String gobank () {// 1. Полные параметры: P2 P3 PD PA, вам необходимо получить SESSION FORDER = (FORDER). Get ("OldForder"); Пользователь пользователь = (пользователь) session.get ("user"); model.setp2_order (forder.getid (). toString ()); // MODER MODELER MODEL.SETP3_AMT (forder.getTotal (). ToString ()); // Модель суммы платежа.setpa_mp (user.getemail () + "," + user.getphone ()); // Информация о расширении продавца // 2. Приложение параметров // 3. Зашифруйте и получите подпись // 4. Хранить в домене запроса в Payservice.savedatatorequest (запрос, модель); // 2,3,4 Бизнес -логика передается уровню обслуживания для обработки // 5. Прыгнуть на страницу платежа возврат "оплата"; }}Далее, давайте напишем код сервисного уровня. Служба в основном реализует логику вышеуказанных 2, 3 и 4 шагов:
3. Внедрение уровня обслуживания
Конкретный код заключается в следующем:
// Интерфейс PayService Public Interface PayService {// Хранение зашифрованной информации в общедоступной абстрактной карте requestMap <String, Object> SavedAtAtAtorequest (map <String, Object> Request, SendData SendData); //Encrypt the returned data to obtain the ciphertext, and compare it with the sent back ciphertext (we will implement it later) public boolean checkBackData(BackData backData);}//payServiceImpl implementation class @Service("payService")public class PayServiceImpl implements PayService { //Key @Value("#{prop.key}") private String ключ; @Value ("#{prop.p1_merid}") // MER Account (не номер заказа) Private String P1_Merid; // Адрес возврата для успешной оплаты @Value ("#{prop.p8_url}") частная строка p8_url; // Все приведенные выше три атрибута являются фиксированными значениями, я поместил их в файл конфигурации Pay.Properties и напрямую использую пружинную аннотацию @Value для получения // заполнить данные SendData, 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"); вернуть SendData; } // Заполните добавление данных и верните добавленную открытый текст частной строки joinSendDataparam (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 (); } // Хранить зашифрованную информацию в общедоступной карте @Override <String, Object> saveDatatorEquest (map <String, Object> Request, SendData sendData) {// возвращать строку для добавления (т.е. plantext) 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)); // Добавить подпись (зашифрованный текст) return request; }}Мы видим, что принцип реализации на самом деле такой же, как и сервлет в предыдущей демонстрации. Приведенный выше код использует файл и аннотации Pay.properties. Давайте посмотрим на конфигурацию в файле Pay.properties и Beans.xml:
#pay.propertieskey = w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677p1_merid = 10000940764p8_url = https/: //www.hao123.com
<!-beans.xml-> <bean id = "prop"> <name = "locations"> <array> <datue> classpath: public.properties </value> <!-之前用到的-> <Daga>
Хорошо, теперь, когда написаны уровни действия и сервис, давайте снова настроим файл struts.xml:
4. Конфигурация struts.xml и страница Pay.jsp
<name Action = "pay_*" method = "{1}"> <name = "pay">/user/pay.jsp </result> </action>Конфигурация struts.xml очень проста. В основном он переходит на страницу пользователя/pay.jsp в соответствии со значением возврата и отправляет открытый текст (параметры) и Ciphertext (подпись), установленные выше на сервер Yibao:
<div> <pan> Номер заказа: </span> <strong> $ {requestScope.p2_order} </strong> <pan> [пожалуйста, помните об этом номере, чтобы вы могли использовать его при выполнении платежей и запросов] </span> </div> <div> <pran>. </span> <img src = "$ {shop} /files/yibao.jpg"/> </div> <div> <pan> платежный банк: </span> <img src = "$ {shop}/files/bankimages/$ {pd_frpid} .gif"/> </div> <div> <form name = "yeepay"/> </div> <div> <form name = " action = 'https: //www.yeepay.com/app-merchant-proxy/node' method = 'post' target = "_ blank"> <input type = 'hidden' name = 'p0_cmd' value = '$ {requestScope.p0_cmd}'> <input = 'hidden' nameld = 'p1_merid' value = '$ {requestScope.p1_merid}'> <input type = 'hidden' name = 'p2_order' value = '$ {requestscope.p2_order}'> <input type = 'hidden' name = 'p2_ord value = '$ {requestScope.p3_amt}'> <input type = 'hidden' name = 'p4_cur' value = '$ {requestScope.p4_cur}'> <input type = 'hidden' name = 'p5_pid' value = '$ {request.p5_pid}'> <input type = 'hidden' ame = '$ {request.p5_pid}'> <input = 'hidden' name = 'name =' name = 'wame =' wome = 'wampc value = '$ {requestScope.p6_pcat}'> <input type = 'hidden' name = 'p7_pdesc' value = '$ {requestScope.p7_pdesc}'> <input type = 'hidden' name = 'p8_url' value = '$ {requestScope.p8_url}'> <input type = 'name' name's = 'name's =' name's = 'name's =' name's = 'name's =' name's = 'name's =' name's = 'name' name value = '$ {requestScope.p9_saf}'> <input type = 'hidden' name = 'pa_mp' value = '$ {requestScope.pa_mp}'> <input type = 'hidden' name = 'pd_frpid' value = '$ {requestscope.pd_frpid}'> <input type = "hidden" nameed "nameed" valy nameed ". value = "$ {requestScope.pr_needresponse}"> <input type = 'hidden' name = 'hmac' value = '$ {requestScope.hmac}'> <div> <input value "value =" Pay Now "/> </div> </form> </div> </div> PAY.JSP отправит весь простой текст, который мы хотим передать, и соответствующий текст шифра на сервер Yibao. Yibao зашифрует его в текст шифра таким же образом на основе этих простых текстов, а затем сопоставит его с текстом шифра, который мы передали. Если то же самое означает, что данные безопасны, они не подделаны во время процесса передачи, и нормально перейти на страницу платежей, а затем выполняют нормальный платеж; Если это не то же самое, оплата не допускается, и появляется дружелюбная страница подсказки.
На этом этапе я уже дал понять об этом процессе онлайн -оплаты. Причина очень проста. Это не что иное, как добавление параметров вместе для их формирования, добавление пароля для генерации зашифрованного текста, а затем отправлять эти параметры и зашифрованный текст третьей стороне. Он также добавляет пароль в том же методе шифрования и сравнивает его с тем, что я его отправил. Что касается того, как позвонить в интерфейс банка, это не то, что мы должны делать. Это обязанность третьей стороны, включая некоторые вещи безопасности. Каждый может сосредоточиться на своих собственных делах: мне просто нужно связаться с третьей стороной и передавать ему полезную информацию; Третья сторона должна сосредоточиться только на том, как общаться с различными банками, что приносит большое удобство для развития. Потому что интерфейсы, связанные с разными банками, определенно разные. Если мы пойдем напрямую, чтобы связаться с банками, стоимость слишком высока, и это неудобно для обслуживания. Если банк обновится, я также должен их обновить ... с третьей стороной, нам никогда не придется беспокоиться об этом. Обновление является вопросом третьей стороны, и наш интерфейс со третьей стороной не изменится ~
Оригинальная ссылка: http://blog.csdn.net/eson_15/article/details/514644415
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.