В этом разделе мы сначала напишем простую демонстрацию, чтобы проверить процесс оплаты Yibao. После ознакомления с этим процессом мы сделаем реальное развитие. Поскольку это демонстрация, я не рассматривал некоторые шаблоны проектирования, а просто непосредственно реализовывать функцию оплаты. Для реализации функций оплаты Yibao требуется предоставленный нам API. Таким образом, вопрос в том, что наиболее важным при использовании сторонней платформы является получение API платформы. Сначала мы должны получить их документы API и разработки, а затем мы можем сделать дальнейшее развитие.
1. Получите API Yibao's API
Первый шаг к получению API - зарегистрировать учетную запись на Yibao. Эта учетная запись является аккаунтом продавца. После того, как покупатель выплатит, он внесет деньги на счет, и продавец сам выводит их на банковскую карту. Yibao взимает определенную плату за обработку во время процесса отмены. Это модель прибыли Ибао. Тем не менее, необходимым условием для успешной регистрации является то, что у вас должен быть веб -сайт или компанию, бара, бара и т. Д. В любом случае, вы должны быть квалифицированы для подачи заявления. Yibao рассмотрит этот момент. Только когда вы встретите его, позволит вам зарегистрироваться и предоставить вам их интерфейс. Не каждый может зарегистрироваться. Я использовал это так же, как и другие, зарегистрированные, но у меня ничего не было ... Я не мог зарегистрироваться ... Я знаю это, но, как правило, при разработке в компании, этой проблемы не было бы. Должен быть аккаунт. Самое главное, чтобы овладеть процессом разработки и связанных с ними технологий.
2. Проверьте процесс оплаты
С официальным API и техническими документами вы можете начать развиваться. Здесь мы в основном пишем простую демонстрацию, чтобы проверить процесс оплаты Yibao. Структура демонстрации очень проста, сервлет, фильтр, две страницы JSP и зашифрованный класс инструментов. Сервлет имеет дело с серверной стороной Yibao. Мы делаем некоторую обработку, связанную с интерфейсом Yibao. Фильтр используется для решения возможных китайских искаженных проблем. Одним из двух JSP является линейная страница.
Давайте сначала проанализируем процесс запроса на оплату, как показано ниже:
Хорошо, давайте подробно проанализируем соответствующий код в демонстрации:
2.1 Тестовая страница на стойке регистрации
Во -первых, давайте посмотрим на конкретный код страницы на стойке регистрации.
<%@ page language = "java" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 Transitional // en"> <html> <Head> <title> Фронт-офис Дому </title> </head> <hody> <h1> <heml> </H1> </h1> </h1> </h1> </h1> action = "$ {pageContext.Request.contextPath}/Servlet/Payservlet" Method = "post"> Номер заказа для этого покупки <input type = "text" name = "p2_order"/> <br> Money <input type = "text" name = "p3_amt" value = "0.01"/> <br> Промышленное и коммерческое банковское банков <Neply = "kvaly =" value = "0.01"/> <br> Промышленное и коммерческое банковское банков <Nopt value = "kvalue =" value = "0,01"/> <br> Промышленное и коммерческое банковское банков. name = "PD_FRPID"> Construction Bank <input Type = "radio" value = "ccb-net" name = "pd_frpid"> <br> <input type = "Отправить" value = "pospent"/> <input type = "hidden" value = "pay" name = "/> </form> </> </html>На приведенной выше странице JSP мы видим, что значения атрибута имени в этих входных тегах очень странные, pi_function (i = 0,1,2,…, 9), и, конечно, у меня есть другие значения. Это требует обращения к официальному документу Ибао. Эти имена представляют соответствующие атрибуты и будут переданы в севлет для обработки. Что касается этих значений атрибутов, у меня есть изображение следующим образом:
Некоторые из этих имен параметров передаются со стойки регистрации в реальных проектах, таких как номер заказа, написанный выше, сколько стоит платить, и они будут приняты, когда заказ будет подтвержден. Если требуются другие параметры, они должны быть указаны в сервлете. Если поля не требуются, они могут быть пустыми. Пусто здесь не нулевой, но «», что будет упомянуто в сервлеле позже.
Давайте посмотрим на соответствующие значения значений в двух банках. Yibao предоставит стоимость всех банков, которые она поддерживает. Они фиксируются и не могут быть изменены. Вот два банка, чтобы проверить эффект.
Последнее скрытое поле используется для вынесения суждения в сервлете. Будь то платеж или возврат после успешного платежа, это будет объяснено в севлете ниже.
2.2 Сервлет обрабатывает запросы
Сервлет в основном обрабатывает соответствующие запросы с Ибао. Есть две части контента. Одна часть состоит в том, чтобы отправить простой текст и текст шифра в Йибао, а другая - судить простой текст и текст шифра, отправленный Ибао. Давайте посмотрим на конкретный код реализации в демонстрации:
Public Class Payservlet Extens Httpservlet {public void Doget (httpservletrequest запрос, httpservletresponse response) throws servletexception, ioexception {String status = request.getParameter ("status"); if (status.equals ("pay")) {// Скрытое поле в index.jsp выплачивается, поэтому платежная часть обрабатывается // Ключ шифрования используется в алгоритме шифрования и предоставляется платежным посредником. Каждый торговец имеет уникальную строку keyvalue = "w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677"; // 1: назначить значения параметрам. Эти параметры (то есть простой текст) определены в документе, предоставленном Yibao. Мы не можем изменить name string p0_cmd = formatstring ("buy"); String p1_merid = formatstring ("10000940764"); String p2_order = formatstring (request.getParameter ("p2_order")); String p3_amt = formatstring (request.getParameter ("p3_amt")); String p4_cur = formatstring ("cny"); String p5_pid = ""; String p6_pcat = ""; String p7_pdesc = ""; String p8_url = "http://www.tongji.edu.cn"; // Это страница, на которую вы прыгаете после успешной оплаты. Вы можете установить его как домашнюю страницу торгового центра. Этой демонстрации достаточно, чтобы использовать домашнюю страницу Университета Тонгджи ... String P9_SAF = "0"; String pa_mp = ""; String pd_frpid = formatstring (request.getParameter ("pd_frpid")); pd_frpid = pd_frpid.touppercase (); String pr_needresponse = "0"; String hmac = formatstring ("" "); // HMAC используется для хранения Ciphertext/*Все открытый текст выше обернут методом Formatstring. Метод приведен ниже, в основном преобразование NULL в «» *, потому что NULL не может быть преобразован в CipherText *// Решение вопросов безопасности данных: зашифровать открытый текст ---> Ciphertext, а затем передайте как открытый текст, так и цифровый текст на yibao // после Yibao получает данные, зашифровал переданный текст и не соответствует установленной тексту,/ не был в соответствии с таковой. Merchant и 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 будет предоставлять его, потому что он также должен использовать тот же алгоритм HMAC = digestUtil.hmacsign (infobuffer.toString (), keyvalue); // хранить как простой текст, так и текст шифра в 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"). Forward (запрос, ответ); } else if (status.equals ("success")) {// Что происходит от Yibao, - это успех, обработка возвращает проверку printwriter out = response.getWriter (); String keyvalue = "w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677"; // Получить все текстовое строку r0_cmd = formatstring (request.getParameter ("r0_cmd")); String p1_merid = request.getParameter ("p1_merid"); String r1_code = formatstring (request.getParameter ("r1_code")); String r2_trxid = formatstring (request.getParameter ("r2_trxid")); String r3_amt = formatstring (request.getParameter ("r3_amt")); String r4_cur = formatstring (request.getParameter ("r4_cur")); String r5_pid = new String (formatString (request.getParameter ("r5_pid")). GetBytes ("iso-8859-1"), "UTF-8"); String r6_order = formatstring (request.getParameter ("r6_order")); String r7_uid = formatstring (request.getParameter ("r7_uid")); String r8_mp = new String (formatString (request.getParameter ("r8_mp")). GetBytes ("iso-8859-1"), "UTF-8"); String 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); // определить, равен ли зашифрованный зашифрованный текст с передаваемым сигнатуром данных Boolean isok = md5.equals (hmac); if (isok && r1_code.equals ("1")) {// r1_code - 1, чтобы указать успех // Изменить статус успешного заказа на оплату, и отобразить информацию об успехе платежей для пользователя // позвонить в интерфейс службы электронной почты, SMS SENDING Service и т. Д.//print здесь ~ out.println ("Заказ -" + R6_ORDER + "платежный сумма:" + R3_AMT); } else {out.println ("Fail !!!"); }}} public void dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); } String formatString (String Text) {if (text == null) {return ""; } вернуть текст; }}2.3 Алгоритм шифрования
Алгоритм шифрования, используемый для преобразования простого текста в зашифрованный текст, предоставляется Yibao. Нам нужно только использовать его для преобразования простого текста в Ciphertext. Алгоритм выглядит следующим образом:
открытый класс digestutil {частная статическая строка EncodingCharset = "UTF-8"; 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 (); } 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) {// Параметр 1: plaintext (данные для зашифрования) Параметр 2: Ключевой System.out.println (digestutil.hmacsign ("11111", "abc")); System.out.println (digestutil.hmacsign ("11111", "abd")); // Решение вопросов безопасности данных: зашифровать простой текст ---> Секретный текст и простой текст с Yibao // После того, как Yibao получает данные, зашифруйте переданный простой текст и сравните его с передаваемым текстом шифра. Если равные данные не были подделаны (торговец и Yibao используют один и тот же ключ при шифровании)}}}}}}}}}}}}}}Я не слишком много изучал алгоритм шифрования. Похоже, это алгоритм шифрования MD5 второго поколения. В любом случае, просто бросьте в него простой текст, и он определенно будет зашифрован в зашифрованный текст. Давайте посмотрим на страницу reqpay.jsp:
<%@page language = "java" contentType = "text/html; charset = gbk"%> <html> <head> <title> на yeepay page </teal> </heep> <body> <form name = "yeepay" action = 'https: //www.yeepay.com/app-merchant-proxy/node =' https: //ww.yeeepay.com/app-merchant-proxy/node = 'https: //www.yeeepay.com/app-merchant-proxy/node =' https: //ww. type = 'hidden' name = 'p0_cmd' value = '$ {requestScope.p0_cmd}'> <input type = 'hidden' name = 'p1_merid' value = '$ {requestScope.p1_merid}'> <input = 'hidden' name = 'p2_ord type = 'hidden' name = 'p3_amt' value = '$ {requestScope.p3_amt}'> <input type = 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <input = 'hidden' name = 'p5_pid' value = '$ {refectscope.p5_pid'> name = 'p6_pcat' value = '$ {requestScope.p6_pcat}'> <input type = 'hidden' name = 'p7_pdesc' value = '$ {requestscope.p7_pdesc}'> <input type = 'hidden' name = 'p8_url' valu name = 'p9_saf' value = '$ {requestScope.p9_saf}'> <input type = 'hidden' name = 'pa_mp' value = '$ {requestScope.pa_mp}'> <input type = 'hidden' name = 'pa_mp' value = '$ {requestScope.pa_mp} value = '$ {requestScope.pa_mp}'> <input type = 'hidden' name = 'pd_frpid' value = '$ {requestScope.pd_frpid}'> <inpute = "hidden" name = "pr_needresponse" value = "$ {requestScope.pr_needresponse}"> <input type = 'hid name' 'hid name' 'hid name =' hid name '=' hid name '' 'hid name' '' hid name = 'hid name =' hid name valy = 'hid name value = '$ {requestScope.hmac}'> <input type = 'propect'/> </form> </body> </html> На самом деле эта страница очень проста. Это передавать простой текст и текст шифра в Yibao через форму <form> . Получающий URL-адрес Yibao- https://www.yeepay.com/app-merchant-proxy/node . Это также предоставляется чиновником Yibao, и мы можем написать это. На самом деле, есть только кнопка submit . Нажмите кнопку submit , чтобы отправить простой текст и текст шифра. Давайте посмотрим на результаты теста:
3. Результаты тестирования оплаты
Простой тестовый индекс на стойке регистрации. JSP ~~~:
После отправки вы пойдете в REQPay и JSP. Эффект после нажатия кнопки «Отправить» заключается в следующем. Мы протестируем как ICBC, так и CCB:
Нет проблем с процессом оплаты. Первоначально я планировал заплатить 1 цент в ICBC, чтобы увидеть результаты после завершения платежа, но я обнаружил, что U-Shield истек, потому что сейчас удобнее использовать Alipay ... Я не обновлял U-shield, но я открыл электронную оплату через ICBC, поэтому я также могу использовать электронную оплату в вышеупомянутом интерфейсе, поэтому я заплатил 1 цент general.
Тогда он перейдет на страницу, которую мы указывали ранее, то есть Университет Тонгджи ... хорошо, тест завершен, и весь процесс оплаты закончился!
Этот раздел в основном проверяет простую демонстрацию, чтобы увидеть, может ли он быть подключен к интерфейсу платежа банка. Теперь тест в порядке, он был подключен, и вы можете просто заплатить, как обычно, позже. Давайте представим простую демонстрацию. Затем мы продолжим разрабатывать модуль онлайн -платежей нашего предыдущего проекта онлайн -торговых центров.
Оригинальный адрес: http://blog.csdn.net/eson_15/article/details/51447492
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.