Я изучал платеж Alipay QR -код некоторое время назад. Я должен сказать, что документ Alipay действительно плохой (по крайней мере, это было от Mengbi, когда я впервые прочитал его). Примеры над документом выглядят совершенно иначе от примеров в демонстрации. Часто примеры выше документа очень просты, в то время как код демонстрации очень сложный, поэтому я не знал, какой код использовать в начале. Позже я тщательно посмотрел код в демонстрационном пакете и обнаружил, что также были вызваны интерфейсы примеров документа. Только тогда я понял, что они были одним и тем же, но демонстрация только завершила интерфейсы документа.
Во -первых, подать заявку на учетную запись компании компании. Эта учетная запись имеет PID, и вам необходимо добавить приложение в эту учетную запись. Каждое приложение имеет аппликацию и публичный и закрытый ключ. Общественные и частные ключи могут быть получены с помощью инструментов, предоставленных Alipay. Кроме того, разработчики Java должны использовать частные ключи в формате PKCS6. Если приложение необходимо использовать функцию сканирования, необходимо добавить опцию личного платежа в приложение, которое требует подписания контракта. После подписания личной платежной функции ее нельзя использовать напрямую, потому что приложение должно быть в сети, прежде чем ее можно будет использовать. Поэтому вы можете использовать версию приложения Sandbox во время разработки. Alipay предоставляет версию Sandbox of the Gateway, Alipay Public Key, PID и Appid, которые необходимо изменить во время конфигурации.
Код может напрямую использовать код в демонстрации, сначала импортируйте API, предоставленный Alipay в проекте (обратите внимание, что это не демонстрационный код), а затем импортируйте демо -код, как показано на рисунке:
Этот файл com.alipay.demo.trade.main можно запускать напрямую, но необходимо настроить файл ресурса:
# Alipay name gateway, PartnerId и Appid# Это шлюз для среды Sandbox open_api_domain = https://openapi.alipaydev.com/gateway.domcloud_api_domain = http://mcloudmonitor.com/gateway.do# Это торговый Заполните AppidAppid для вашей среды песочницы лично здесь = 2016082000300485 # RSA Private Key, Public Key и Alipay Public Key # Пожалуйста, заполните свой частный ключ здесь и перейдите в PKCS8 Format Private_key = Miiceqibadanbgkqhkig9w0baqefaascammwggjfageaogbamkxzrfr+rnvygbs9qz2ce1mcsibreaqan+5pf5+02hyj4hzcnttwqhfm91ih 3wypyhpm7xlbgj5ywjtgc4g1lz75r8a+ucyuxp8by1lv/44gi/tiflsgatfq73ocm9imxocrdyz2zcwqi1gv+b3udoy/da5w07grwizfzs6vq 1ragmbaaecgyeaqhhc4grbsrckeinytk1vhqcj0yg11lvy85z3si0fny26dvs8r5gfydzc/mx5f8rnpuuyuhqn+4cqor3d/c291x1tov2nev LHEJROUDKNP4OQRIQT2W9PZ8RZWZP2JCWVRVUF4ZTPEIMPMPMORP6SPRFX6DLZG29SFI6GZWU6TKCQQDP3MIM1BHUS3YONEZGQC69ZN0/DGOFK eix0s18qau1x4i1fejvtky4hpdwihpgyajm0ufg1lk8mtiunhpzrcnakea1qf6u1akjm6zsvdenrxedtcc75uvjgsyfjwhhhhx9pjyd9vx8nszv 0z0u4v0zg0n0yvhj5lro6u5fcqfrw1wixnqjbalmckz8svf/h9n6liwmspy6w5q82knrlrc7wscenspqt0wql5+sacg98m0xy5j1hmiolhxg Ctvyrixowobivqccqqcctnanb4uz3q/86r/kukbvd3dirwlfryaho6yxp8oy+je/bv/359+vr3cxzyyldhzor9/tvspwr/y9q4jlem q1takealbu7+4edzfap7e/fmgykd5dml8h2iaeumrcpl844ghffk/7psq/40ngkxptgy44nlelhxcrpw5czu6gqdinjoa ==#пожалуйста Заполните свой торговец public_key здесь = Migfma0gcsqgsibdqebaquaa4gnadcbiqkbgqdcl2axufq572iabpas9nbnzgkiauxmqmp/ut3+ftnh8o+b83du01qhxzvdsb98gd8oato15w4 Ceclibyauinzc ++ a/gvlasrst/g8ts1f+obov0yhy0oae30o9zndpypl6hexwm9mqskotyffm91a6mvw2ucno4evosxc0ulatawidaqab#this является открытым ключом среды песочницы alipay_public_key = Migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdighnon7lliltketd6bfrj0gqgs2y3mn1wmqmyh9zeywlz5p1zrahrahbxafcfsqshsnfq Omaqzshrvjcqjsaw1jyqrxapdkbmr90dipixmiykxv4ggakpyj/6ftfy99uhpiq0qadd/uszqsefwo0atvp/65zi3eof7tcz32owpwidaqab# Максимальное количество запросов и интервала запросов (миллисекунды) max_query_retry = 5query_duration = 5000# Максимальное количество отходов и постоянных интервалов (MS).
Затем запустите файл main.java. Что касается кода платежа для кода сканирования в нашем фактическом приложении, мы можем напрямую скопировать функцию TEST_TRADE_PRECREATE () в файле main.java и создать функцию в контроллере:
@Requestmapping (value = "/pay/alipay", method = requestMethod.post) public map <string> alipay (@RequestParam String Summ, @RequestParam int userId) {map <string> map = new hashmap <string, string> (); // (требуется) уникальный номер заказа в системе заказа на веб -сайт торговцев, только с 64 символами, может содержать только буквы, числа и подчеркивание. // необходимо убедиться, что торговая система не может быть повторена. Рекомендуется генерировать его через последовательность базы данных, string outtradeno = "xxxxx" + system.currenttimelis () + (long) (math.random () * 10000000l); // (требуется) заголовок заказа, примерно описывает цель платежа пользователя. Например, «xxx Brand Xxx Store платит лично и сканирует код, чтобы потреблять« string subject = »; // (Требуется) Общая сумма заказа составляет 100 млн. Юаней и не может превышать 100 млн. Юаней //, если [дисконтированная сумма], [не дисконтированная сумма], а [общая сумма заказа] передается в одно и то же время, необходимо выполнить следующие условия: [общая сумма упорядочения] = [дисконтированная сумма] + [не дисконтированная сумма] Строковая TotalAmount = сумма; // (необязательно) Порядок не может быть со скидкой сброшенной суммы и может быть настроен с торговой платформой для настройки действий скидок. Если алкоголь не участвует в скидке, соответствующая сумма будет заполнена в этом поле //, если значение не передается, но [общая сумма заказа] и [дисконтированная сумма] передается, значение по умолчанию по умолчанию [общая сумма заказа]-[дисконтированная сумма] string undiscountableAmount = "0"; // Идентификатор учетной записи Alipay продавца используется для поддержки платежей в различных платежных счетах в рамках контрактной учетной записи (оплата учетной записи Alipay, соответствующей SellerID) // Если это поле пустое, оно по умолчанию по умолчанию в PID торговца, подписанного с Alipay, то есть PID, соответствующий Appid String Sellerid = "2088102172298833"; // Описание заказа, вы можете описать транзакцию или продукт подробно, например, заполнение «2 покупки 2 предметов в общей сложности 15,00 юань». // номер оператора торговца, добавьте этот параметр для выполнения статистики продаж для торгового оператора string operatorid = "test_operator_id"; // (требуется) номер торгового магазина, через номер магазина и бэкэнд продавца, вы можете точно настроить скидку в магазин. Для получения подробной информации, пожалуйста, проконсультируйтесь с Alipay Technical Support String stringiad = "2088102172329883"; // Параметры расширения бизнеса, в настоящее время вы можете добавить номер поставщика системы, назначенный Alipay (с помощью метода SetSysServiceProviderId). Для получения подробной информации, пожалуйста, обратитесь к Alipay Technical Support ExtendParams extendParams = new ExtendParams (); extendParams.setsySserviceProviderid ("2088100200300400500"); // Тайм -аут оплаты, определяемый как 120 минут строки timeOutexpress = timeout; // // Список данных о продукте, вам необходимо заполнить детали продукта покупки, // list <goodsdetail> GoadeDetaillist = новый ArrayList <dowsDetail> (); // // Создание информации о продукте, параметры являются идентификатором продукта (используемый национальный стандарт), имя, на единое целое (единица в баллах) и квадрат. Если вам нужно добавить категории продуктов, пожалуйста, обратитесь к GoodsDetail // GoodsDetail Goods1 = GoodsDetail.newinStance ("Goade_ID001", "XXX Малый Хлеб", 1000, 1); // // Добавить в список деталей продукта после создания продукта // GoodsDetaillist.Add (Goald1); ///////////// /////// // // продолжить. Продукт, приобретенный пользователем, является «Черной зубной щеткой», с ценой за единицу 5,00 юаней. Я купил две вещи // GoodsDetail Goods2 = GoodsDetail.NewInstance ("Goved_ID002", "XXX Зубная щетка", 500, 2); // GoodsDetaillist.Add (Goods2); // Create a scan code to pay the request builder, set the request parameters AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder() .setSubject(subject) .setTotalAmount(totalAmount) .setOutTradeNo(outTradeNo) .setUndiscountableAmount(undiscountableAmount) .setellerid (sellerid) .setbody (body) .setoperatorid (OperatorId) .SetStoreID (storeId) .setexTendParams (extendParams) .setTimeOutexPress (TimeOutExpress) .setNotifyUrl ("http://xxx.xx.xx.xxx:8080/baobaobaobaobay/alempay/alempay/alempay/alempay/alempay/alempay/alempay/baobaobay //xx.xx.xx.xx. Активно уведомляет страницу HTTP -пути, указанную на торговом сервере. Установить по мере необходимости. Здесь мы установили интерфейс, который мы написали сами. Мы представим это позже. // .setgoodsdetaillist (GoodsDetaillist); Alipayf2fprecreateresult result = tradeservice.tradeprecreate (строитель); Switch (result.getTradeStatus ()) {Case Success: log.info ("Alipay, предварительно заказанный успешно :)"); System.out.println ("Alipay успешно заказан :)"); Alipaytradeprecreateresponse response = result.getresponse (); // dumpresponse (response); // system.out.println (response.getbody ()); // // // // это необходимо изменить на путь на запущенной машине // string filepath = string.format ("/user/liuyangkly/qr-%s. response.getOutTradeno ()); // log.info ("filePath:" + filePath); // zxingutils.getQrCodeimge (response.getQrCode (), 256, filePath); // system.out.println (response.getQrcode ()); // Сгенерируйте заказ и вставьте базу данных BaobioOrder Order = new Baobiaoorder (userId, Outtradeno ",", Double.parsedouble (сумма), новая дата (), 1); baobiaoorderservice.insertorder (порядок); map.put ("status", "true"); map.put ("qrcode", response.getqrcode ()); // Возвращение к клиентскому QR -коду Map.put ("Outtradeno", Outtradeno); карта возврата; Дело не удалось: log.error ("Предварительный заказ Alipay не удался !!!"); System.out.println («Предварительный заказ Alipay не удался !!!»); System.out.println (result.getResponse (). GetBody ()); перерыв; Дело неизвестно: log.error ("Системное исключение, статус предварительного заказа Неизвестно !!!); System.out.println ("Системное исключение, статус предварительного заказа Неизвестно !!!); перерыв; по умолчанию: log.error ("Неподдерживаемая статус транзакции, транзакция возвращает исключение !!!"); System.out.println («Неподдерживаемая статус транзакции, транзакция возвращает исключение !!!»); перерыв; } map.put ("status", "false"); map.put («msg», «У системы есть исключение, попробуйте еще раз позже!»); карта возврата; }Логика заключается в том, что пользователь сканирует код на своем мобильном телефоне, чтобы заплатить Alipay, а затем после того, как Alipay получит его, он отправит нам сообщение об успешном платеже, чтобы установить notify_url, как показано ниже:
@RequestMapping (value = "/pay/notify", method = requestMethod.post) public String notifyResult (httpservletrequest, httpservletresponse response) {log.info ("Полученное асинхронное уведомление Alipay!"); Map <string, string> params = new hashmap <string, string> (); // Получить все параметры для проверки перечисления подписи <string> parameternames = request.getParameternames (); while (parameternames.hasmoreElements ()) {string parametername = parameternames.nextelement (); params.put (parametername, request.getParameter (parametername)); } boolean signverififified; try {signverifified = alipaysignature.rsacheckv1 (params, configs.getalipaypublickey (), "UTF-8"); } catch (alipayapiexception e) {e.printstacktrace (); вернуть "неудачный"; } if (signverififified) {string outtradeno = params.get ("out_trade_no"); log.info (Outtrodeno + "Уведомление о вызове заказа."); // System.out.println («Успешно проверить подпись!»); log.info («проверьте подпись успешно!»); // Если Appid в параметре отличается от заполненного аппетитом, это уведомление о исключении, если (! Configs.getAppid (). Equals (params.get ("app_id")))) {log.warn ("отличается от Appid во время оплаты, это уведомление об исключении и следует игнорировать!"); вернуть "неудачный"; } // Найти порядок, соответствующий номеру заказа в базе данных, и сравните его сумму с суммой в базе данных. Если он не соответствует, это также уведомит исключение Baobiooorder order = baobiaoorderservice.findorderbyouttradeno (Outtradeno); if (order == null) {log.warn (Outtradeno + "Проверьте этот заказ без проверки!"); вернуть "неудачный"; } if (order.getAmount ()! = double.parsedouble (params.get ("total_amount"))) {log.warn ("отличается от суммы во время оплаты, это уведомление о исключении и должно быть проигнорировано!"); вернуть "неудачный"; } if (order.getStatus () == baobiaoorder.trade_success) return "успех"; // Если заказ был успешно выплачен, игнорируйте это статус строки уведомлений = params.get ("trade_status"); if (status.equals ("wait_buyer_pay")) {// Если статус ждет пользовательского платежа if (order.getStatus ()! = baobiaoorder.wait_buyer_pay) baobiaoorderservice.modifytradestatus (baobiaoorder.wait_buyer_pay, OutTradeNous); } else if (status.equals ("trade_closed")) {// Если статус невыплаченная тайм -аут транзакции, или платеж полностью возмещается if (order.getStatus ()! = baobiaoorder.trade_closed) baobiaoorderservice.modifytradestatus (baobiaoorder. } else if (status.equals ("trade_success") || centus.equals ("trade_finisted")) {// Если статус успешно оплачен, если (order.getStatus ()! = baobiaoorder.trade_success) baobiaoorderservice.modifytradestatus (baobiaoorder.traderadeRevice. } else {baobiaoorderservice.modifytradeStatus (baobiaoorder.unknown_state, Outtradeno); } log.info (Outtrodeno + "Статус порядка был изменен на" + status); } else {// Если подпись проверки не проходит return "не удастся"; } вернуть "успех"; }Вероятно, это так, но у клиента меньше уведомлений о успешной оплате, а также есть некоторые проблемы безопасности.
Наконец, давайте обобрим проблемы, столкнувшись в этом процессе:
1. Код QR, возвращаемый Alipay, не может быть открыт непосредственно в браузере, но должен использоваться для преобразования QR -кодов для генерации QR -кодов, или вы можете просматривать их через веб -сайт CLI.im.
2. Код QR, сгенерированный средой Alipay Sandbox, может быть отсканирован только с помощью версии Sandbox Mobile Pholle. Если нормальная версия сканирования Alipay, QR -код истекает и возникнут другие ошибки.
3. Если вы не можете получить асинхронное уведомление, отправленное Alipay после оплаты, вы можете использовать почтальон и другие инструменты, чтобы проверить, можно ли получить доступ к notify_url, в котором вы заполнили, используя публичный IP.
4. Если вы сталкиваетесь с проблемой недостаточных разрешений ISV, это связано с тем, что нет подписания контракта или приложение не добавило соответствующие функции, и приложение не может использоваться без онлайн. Вы можете выбрать приложение из песочницы во время разработки.
5. При регистрации версии мобильного телефона Alipay Sandbox вы можете связаться с службой поддержки, чтобы попросить учетную запись
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.