1. Обзор онлайн -платежа
Что такое онлайн -платеж? Правильно, это просто тратить деньги в Интернете! У каждого, должно быть, был такой опыт. Но вы можете не знать много о «внутренней истории» онлайн -платежа, давайте узнаем об этом ниже!
Если вы начинаете запускать веб-сайт электронной коммерции сейчас, пользователи должны заплатить, если они что-то купят. Ваш сайт должен иметь возможность подключаться к крупным банкам. Затем, после завершения оплаты, вернитесь на ваш сайт, чтобы отобразить «Успех оплаты»!
Это то, что мы собираемся сделать сегодня, подключитесь к системе онлайн -банкинга банка для завершения платежей. Чтобы быть более профессиональными, мы называем это "разработкой шлюза для онлайн -платежей"
2. Два способа оплаты онлайн
Есть два способа оплаты онлайн:
*Электронная коммерция напрямую соединяется с банками
*Электронная коммерция соединяется с банками через сторонние платежные платформы
Электронная коммерция напрямую соединяется с банками, что требует согласия банка, но, к сожалению, банки очень «потрясающие», а не любой, кто хочет с ними связаться. Если ваш бизнес электронной коммерции имеет большой ежедневный поток капитала, банк свяжется с вами, потому что все деньги, уплаченные клиентом, на электронную коммерцию, депонируются на банковский счет! Но если поток капитала невелик, банк не будет обращать на вас внимание!
Когда небольших веб-сайтов недостаточны в средствах и не могут связаться с банками, они решили сотрудничать со сторонними платежными компаниями. Каждый также понимает, какие это компании, такие как Alipay, Yibao, Fortune, Kuaiqian и другие компании, относительно известны в Китае. Эти компании могут связаться с банками (потому что у них достаточно средств), и тогда небольшие компании электронной коммерции могут связаться с ними! Но третьим лицам требуется плата! Третьи стороны, как правило, взимают 1% сборов за электронные коммерции, но они не будут взимать деньги клиентов.
Через вышеупомянутое изображение вы можете узнать, что имя торгового центра, номер заказа RMB и время заказа будет отображаться на странице банка. Полем Полем , как банки узнают об этих вещах? Конечно, это передается банкам по электронной коммерции. После того, как компания электронной коммерции подключится к банку, компании электронной коммерции необходимо передать параметры, требуемые страницей банка на банковскую страницу, поэтому на странице банка может отображаться эти данные!
Однако наш торговый центр не может подключиться только к одному банку! Мы должны связаться с четырьмя компаниями BOC, CCB, ABC и ICBC! Параметры стыковки, требуемые разными банками, разные, что означает, что нам нужно написать разные коды стыковки для разных банков во время разработки. Это также недостаток непосредственного соединения с банками! Конечно, прямая связь с банками также полезна, то есть безопасность не требуется, без оплаты за обработку!
Разработать разные коды для разных банков (недостатки);
Безопасность (преимущества);
Нет платы за обработку (преимущества);
Небольшие банки электронной коммерции не разрешают соединения (недостатки).
Как показано на рисунке выше, после того, как клиент нажимает, чтобы подтвердить оплату на веб-сайте электронной коммерции, он будет направлен на веб-сайт третьей стороны, а затем третья сторона свяжется с банком. Это показывает, что электронная коммерция должна передавать параметры третьей стороне! Затем третья сторона передает параметры в банк. Преимущество этого метода состоит в том, что его необходимо разработать только для третьих лиц без предоставления параметров каждому банку. Это сторонняя задача для предоставления параметров каждому банку. Однако, если третья сторона не старая и надежная, если третья сторона обанкротится, и люди убегают, тогда ваши деньги исчезнут. Поскольку деньги, уплаченные клиентом, не обращаются на ваш банковский счет, они выплачиваются на банковский счет третьей стороны, и у вас есть счет на третьей стороне. Кроме того, третьи стороны также взимают плату за обработку, обычно 1%, что не является небольшим числом (это действительно плохо).
3. через сторонние правила онлайн-платежей
Если электронная коммерция хочет зарегистрировать продавца с третьей стороной, она должна предоставить сертификацию ICP третьей стороне. Лицензия ICP Business - это лицензия на бизнес -бизнес, которая должна быть обработана бизнес -веб -сайтом в соответствии с национальными «мерами управления интернетом». Если это не так, это незаконно работать.
Мы не можем подать заявку на ICP только из -за практики! Таким образом, мы не можем зарегистрировать продавца с третьей стороной. Тем не менее, у нас уже есть готовые торговцы, зарегистрированные в Yibao, поэтому этот шаг можно игнорировать.
Когда вы успешно зарегистрируетесь в Yibao, Yibao даст вам следующие вещи:
Откройте учетную запись в Yibao (то есть торговый код): 10001126856
Спецификация доступа Yibao: Алгоритм симметричного шифрования файла CHM Класс Алгоритма: Платеж.
Ключ: 69CL5222AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
В спецификации доступа Yibao мы можем найти платежный шлюз Yibao, который на самом деле является URL, URL-адрес
В спецификации доступа Yibao вы также можете найти параметры, требуемые Yibao. Когда электронная коммерция соединяется с Yibao, эти параметры должны быть переданы в платежный шлюз:
Официальный адрес запроса: https://www.yeepay.com/app-merchant-proxy/node
Эти параметры должны быть добавлены к URL.
Однако имейте в виду, что значения этих параметров должны быть зашифрованы. И ключ шифрования, и алгоритм шифрования Yibao предоставит!
где P8_URL указывает, к какой странице вернуться, когда оплата успешна. Это означает, что нам нужно написать страницу, которая отображает результаты. После того, как платеж будет успешным, третья сторона будет перенаправлена на обратную страницу, которую мы указали, а также принесет нам некоторые параметры. Наша страница должна получить эти параметры и отобразить их на странице. Ниже приведены параметры, возвращенные третьей стороной:
4. Разработка сторонней онлайн-платежной системы
шаг:
index.jsp Страница: форма, отправленная в Buyservlet. Показания формы включают: номер заказа, сумма оплаты, выбор банка
Buyservlet: Получите данные формы и подготовьтесь к подключению к стороннику. Поскольку на странице index.jsp приведены только 3 параметра, и третьим лицам требуется много параметров, параметры, не указанные страницей, дополняются Buyservlet. И параметры также необходимо зашифровать, что также должно быть завершено в Buyservlet
Backservlet: Когда пользователь успешно платит, третья сторона перенаправляет на страницу возврата, которую мы указали. Мы используем Backservtlet в качестве обратной страницы, которая используется для получения параметров, передаваемых третьей стороной, и отображения их на странице.
Поскольку у нас уже есть зарегистрированный бизнес в Ибао, нам не нужно регистрировать бизнес сами. Итак, вот использовать Yibao в качестве сторонней платформы для тестирования. Поскольку у меня нет электронной коммерции (электронная коммерция, которая должна пройти сертификацию ICP), я также не могу зарегистрировать бизнес с третьей стороной.
Бизнес Yibao, который мы используем сейчас, предоставляется подкастом Chuanzhi, бизнесом, зарегистрированным Baba Sports Network на Yibao. Таким образом, деньги, выплаченные во время теста, были переданы компании, зарегистрированной Baba Sports Network на Yibao.
Шаг 1: index.jsp
<form action = "" method = "post"> Номер заказа: <input type = "text" name = "p2_order"/> <br/> сумма: <input type = "text" name = "p3_amt"/> <br/> выберите банк: <input type = "radio" name = "pd_frpid" value = "icbc-net-b2c"/> промышленное и коммерческое банковское банков <icg <icg <icg <icg <icg <icg <icg <icg value = "icbc-net-b2c"/> src = "bank_img/icbc.bmp" align = "middle"/> <input type = "radio" name = "pd_frpid" value = "boc-net-b2c"/> bank of China <img src = "bank_img/icbc.bmp" align = "middle"/> <input type = "name =" pd_frpid "align =" middle "/> <input =" name = "pd_FR Китай <img src = "bank_img/bc.bmp" align = "middle"/> <br/> <input type = "radio" name = "pd_frpid" value = "abc-net-b2c"/> сельскохозяйственный банк Китая <img src = "bank_img/abc.bmp" align = "middle"/> <input yit type = "raily" = "pd_11111111 гг. value = "ccb-net-b2c"/> строительный банк <img src = "bank_img/ccb.bmp" align = "middle"/> <br/> <input type = "radio" name = "pd_frpid" value = "boco-net-b2c"/> bank of Communications <img src = "bank_img/bcc.bmp"/> "/" middious <> "/"/"/" middious = "/"/"/" bank/"/>"/"bank ="/> "/>" Img src = "bank_img/bc.bmp"/> "/>"/> "midder of Communications <img src =" bank_img/bcmp "/>"/> "/>"/> "/>". type = "Отправить" value = "Подтвердить платеж"/> </form>
Соответствующая стоимость каждого банка:
Шаг 2: buyservlet.java
открытый класс Buyservlet Extens Httpservlet {public void dopost (httpservletrequest-запрос, httpservletresponse response) Throws servletexception, ioException {request.setcharacterencoding ("utf-8"); response.setContentType ("text/html; charset = utf-8"); String p0_cmd = "buy"; // Тип бизнеса, фиксированное значение - это купить, то есть "buy" string p1_merid = "10001126856"; // Строка бизнеса P2_Order = request.getParameter ("P2_Order"); // Заказ номер строки p3_amt = request.getParameter ("p3_amt"); "Cny"; // Валюта транзакции, фиксированное значение является cny, указывая на rmb string p5_pid = ""; // название продукта строка p6_pcat = ""; // Название продукта String p7_pdesc = ""; // Описание продукта string p8_url = "http: // localhost: 8080/back/backservlet string string string string = product string = product string = product string = product string = product string = product string = product string = product string = // backrlet"; «http: // localhost: 8080/buy/backservlet»; // обратная страница электронной коммерции, когда оплата успешна, Yibao будет перенаправить на эту страницу строку P9_SAF = ""; // Адрес доставки строки pa_mp = "; // Информация об расширении продукта PD_FRPID = request.getAmeter (PD_FRPID; String pr_needresponse = "1"; // Механизм ответа, фиксированное значение - 1 // ключ, предоставленная Yibao, только торговцы и Yibao знают этот ключ. String keyvalue = "69Cl5222av6q613ii4w6u8k6xuw8vm1n6bfgyv769220iuye9u37n4y7ri4pl"; // Через приведенные выше параметры, ключи и алгоритмы шифрования генерируется значение HMAC // Порядок параметров необходим. Если нет значения, NULL не может быть дано, но должна быть дана пустая строка. String hmac = photographutil.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_needressonse, keevalue); // Подключить все параметры к строке адреса адреса 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 + "& p4_cur +" & p5_pid = " + p5_pid +" & p5_pic. p6_pcat + "& p7_pdesc =" + p7_pdesc = " + p7_pdesc +" & p8_url = " + p8_url =" + p8_url + "& p9_saf =" + p9_saf + "& pa_mp =" + pa_mp + "& pd_frpid =" + pd_fr. pr_needresponse + "& hmac =" + hmac; System.out.println (url); // перенаправление на gateway response.sendredirect (url); }}Шаг 3: Backservlet
Общедоступный класс BackServlet расширяет httpservlet {public void doget (httpservletrequest-запрос, httpservletresponse response) throws servletexception, ioexception {response.setContentType ("text/html; charset = utf-8"); / * * Yibao предоставит серию параметров результатов, мы можем получить в нем то, что нам нужно * получить результат оплаты: r1_code, 1 означает, что оплата успешна. * Получите сумму платежа: r3_amt * Получить номер заказа электронной коммерции: r6_order * Получить результат возврата */ String r1_code = request.getParameter ("r1_code"); String r3_amt = request.getParameter ("r3_amt"); String r6_order = request.getParameter ("r6_order"); String r9_btype = request.getParameter ("r9_btype"); if (r1_code.equals ("1")) {if (r9_btype.equals ("1")) {response.getWriter (). Print ("<h1> Плата успешно! "<br/>"); response.getWriter (). print ("номер заказа:" + r6_order + "<br/>"); }}}}Инструменты для получения HMAC, предоставленного Yibao Payment
Public Class Pulationutil {частная статическая строка inCodingCharset = "utf-8"; /*** Сгенерировать метод HMAC** @param p0_cmd Бизнес -тип* @param p1_merid торговый номер* @param p2_order. Адрес продавца, получающего данные успеха платежей* @param p9_saf адрес доставки* @param pa_mp Информация о расширении торговца* @param pd_frpid банка кода* @param pr_needresponse Механизм ответа* @param Keyvalue Cerchant* @return*/ public String structhmac (string p0_cmd, string p1_mer static strick, p1 Строка 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 boundue) {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 r5_pid Название продукта* @param r6_dorder Номер заказа торговца* @param r7_uid yibao платежный идентификатор платежного идентификатора* @param r8_mp Информация об расширении торговли* @param r9_btype Результат транзакции возвращается String r1_code, string r2_trxid, string r3_amt, string 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 платежный участник идентификатор svalue.append (r7_uid); // Информация о расширении продавца svalue.append (r8_mp); // результат транзакции возвращается тип svalue.append (r9_btype); String SnwewString = Pulationutil.hmacsign (svalue.toString (), KeyValue); вернуть snwestring.equals (hmac); } / ** * @param avalue * @param akey * @return * / public static String hmacsign (String Avalue, String akey) {byte k_ipad [] = новый байт [64]; byte k_opad [] = новый байт [64]; byte keyb []; значение байта []; try {keyb = akey.getbytes (encodingCharset); value = avalue.getbytes (encodingCharset); } catch (unsupportEncodingexception e) {keyb = akey.getbytes (); value = 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); } MessagegeIgest md = null; try {md = messagegest.getinstance ("md5"); } catch (nosuchalgorithmexception e) {return null; } md.update (k_ipad); md.update (значение); byte dg [] = md.digest (); md.reset (); md.update (k_opad); md.update (DG, 0, 16); dg = md.digest (); вернуть ToHex (DG); } public static String toHex (byte input []) {if (input == null) return null; StringBuffer output = 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 (unsupportEncodingexception e) {value = avalue.getBytes (); } MessagegeIgest md = null; try {md = messagegest.getinstance ("sha"); } catch (nosuchalgorithmexception e) {e.printstacktrace (); вернуть ноль; } вернуть toHex (md.digest (значение)); } // public static void main (string [] args) {// System.out.println (hmacsign ("annulcard1000043252120080620160450.0http: //localhost/szxpro/callback.asp 海? 4 564868265473632445648682654736324511 "," 8UPP0KE8SQ73ZVP370VKO7C39403RTK1YWX40TD6IRH216036H27EB12792T "); }}Yibao обратный вызов
Перы-пира: Yibao непосредственно обращается к электронной коммерции, здесь нет клиента.
Этот метод является обязательным, и мы не можем получить его таким образом! Потому что у нас нет фиксированного IP
У Йибао есть механизм повторной эпохи. Если он посетит вас, и вы не отправляете его обратно сообщением, оно будет продолжать повторно!
Электронная коммерция должна вернуть строку, начиная с успеха!
Направляйте клиент-браузер к перенаправлению на электронную коммерцию. Это позволить клиентам получить доступ к электронной коммерции!
Нельзя использовать!
HMAC: 13 Значение параметра + Keyvalue (ключ) + алгоритм (MD5)
13 Значение параметра: установить самостоятельно!
Keyvalue: Тот, что Ибао отправил нам после того, как мы зарегистрировались, только мы и Ибао знали об этой вещи!
Алгоритм с базовым MD5: Pulationutil.buildhmac (14), который возвращает HMAC
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.