1: Ранние знания о платежной грамотности в WeChat
Обязательством является то, что уже есть официальная учетная запись, которая подала заявку на функцию платежей WeChat, и тогда нам необходимо получить официальный аккаунт Appid и WeChat Merchant Account. Это может быть найдено на официальной учетной записи WeChat и платежной платформе WeChat Payment Merchant соответственно. Фактически, после того, как вы успешно подали заявку на функцию оплаты, WeChat отправит вам почту по электронной почте. С помощью этой информации мы можем перейти на страницу поддержки службы платежей WeChat: https://pay.weixin.qq.com/service_provider/index.shtml
Откройте эту страницу и нажмите на ссылку [документ разработки] в правом верхнем углу, чтобы ввести страницу описания документа API, которая выглядит следующим образом
Выберите красный круг, чтобы сканировать код для оплаты, что означает, что нам нужно сделать метод доступа. Переместите мышь в вышеперечисленное и предложите вам просмотреть документ разработки. Если вы не знаете, как это посмотреть, вы можете принять душ и лечь спать. Вы действительно не подходят для программиста. Адрес следующего:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 вы увидите после открытия в своем браузере
Контент, на котором мы фокусируемся и читаем, уже отмечен красным эллипсом. Во -первых, прочитайте спецификации протокола в [правилах интерфейса]. Шучи, если вы не читаете это, вы хотите сделать выплату WeChat. Это как будто вы хотите забрать девушек. Сначала вы должны собрать некоторую основную справочную информацию и понять характеристики другой стороны, иначе как вы можете общаться ниже. Оказывается, что только программисты, которые могут забрать девушек, являются хорошими продавцами. После выхода по теме мы рассмотрим случаи и спецификации в [введение сцены]. Просто посмотрите на логотип WeChat Pay. Это наконец -то поместить его на нашу собственную веб -страницу платежей QR -кода, которая выглядит более профессиональной. После этого сосредоточиться на [режиме 2]
Здесь мы собираемся использовать метод режима 2, чтобы реализовать функцию платежа по сканированию страницы ПК.
Официальное объяснение режима 2 от WeChat заключается в следующем: «Система бэкэнд торговцев сначала вызывает единый единый интерфейс WeChat Pay, система бэкэнд WeChat возвращает параметр ссылки CODE_URL, система бэкэнд торговцев генерирует картинку кода QR с значением CODE_URL, а пользовательский код. Инициирует платеж. инициировать оплату. " Если вы понимаете, мы должны сначала позвонить в WeChat, чтобы предоставить унифицированный отдельный интерфейс и получить ключевую информацию CODE_URL (что, черт возьми, это это CODE_URL, я не знаю), а затем мы генерируем QR -код через нашу собственную программу. Я использую здесь библиотеку Zxing Google. Затем просто отобразите QR -код на веб -странице вашего ПК. Таким образом, пользователь терминала будет оплачивать, сканируя код, и оплата будет завершен. Вы должны быть очень взволнованы, чтобы увидеть это. Вы обнаружите, что оплата WeChat настолько проста. Есть еще одна вещь, которую мы еще не знаем. Клиенты знают, что они заплатили, но наша сторона сервера еще не знает. С IQ разработчиков WeChat они долго думали об этой проблеме. Поэтому, когда вы вызовыте единый единый интерфейс, существует необходимый параметр, который является URL -адресом обратного вызова. То есть, если клиент успешно оплачивает, WeChat отправит некоторые данные на наш собственный сервер через этот URL -адрес, а затем мы анализируем данные в фоновом режиме, чтобы завершить наши собственные операции. Только тогда мы можем узнать, действительно ли клиент заплатил через WeChat. Таким образом, весь процесс закончился, и это шаблон 2. WeChat использует схему синхронизации для представления этого процесса.
Это сложно выразить и кажется сложным. Подводя итог, что должен делать наш сервер следующим образом:
1. Пропустите правильные параметры (конечно, наш URL -адрес обратного вызова) и проверку подписи через единый отдельный интерфейс и получите соответствующие данные CODE_URL из возвратных данных.
2. На основании данных CODE_URL мы генерируем изображение QR -кода и отображаем его на веб -странице браузера.
3. Добавьте нашу собственную обработку бизнес -логики в URL -адрес обратного вызова.
Грамотность уже закончилась, и вы, наконец, знаете, какой процесс заплатить, сканируя код. Давайте посмотрим на его соответствующее использование API и сделаем хорошую работу по обработке каждого шага.
Два: процесс разработки
Перед разработкой кода, пожалуйста, приготовьте несколько вещей в первую очередь.
1. Добавить зависимость Zxing Maven
2. Добавить зависимость JDom's Maven
3. Загрузите демо -программу Java версии SDK, адрес здесь
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
Нам нужны md5util.java и xmlutil.java два файла
4. Мы используем httpclient версию 4.5.1, не забывайте добавить зависимости Maven
После того, как вышеупомянутые приготовления сделаны, продолжите чтение:
Во -первых, нам нужно позвонить в единый интерфейс WeChat. Когда мы нажимаем на единый сингл в [списке API], мы увидим такую страницу:
Принимая фактическую ситуацию моего вызова в качестве примера, необходимы следующие параметры. Для каждого удобства я превратил его в объект Pojo. Код заключается в следующем:
public class UnifiedorderDto implements WeiXinConstants {private String appid;private String body;private String device_info;private String mch_id;private String nonce_str;private String notify_url;private String openId;private String out_trade_no;private String spbill_create_ip;private int total_fee;private String trade_type;private String product_id;private String sign;public UnifiedorderDto() {this.appid = appid; this.mch_id = wxpaymentAccount; this.device_info = device_info_web; this.notify_url = callback_url; this.trade_type = trade_type_native;} public String getAppid () {return Appid; Appid;} public String getBody () {return Body;} public void setBody (строка body) {this.body = body;} public String getDevice_info () {return device_info;} public void setDevice_info (string device_info) {this.device_info = device_info; mch_id;} public void setmch_id (string mch_id) {this.mch_id = mch_id;} public String getNonce_str () {return nonce_str;} public void setnonce_str (string nonce_str) {this.nonce_str = nonce_str setNotify_url (string notify_url) {this.notify_url = notify_url;} public String getOpenid () {return openD;} public void setoPenid (string openD) {this.openid = opend;} public string_trade_no () {return out_trade_no out_trade_no) {this.out_trade_no = out_trade_no;} public String getspbill_create_ip () {return spbill_create_ip;} public void setspbill_create_ip (string spbill_create_ip) {this.spbill_create_ip = spbill_create getTotal_fee () {return total_fee;} public void centotal_fee (int total_fee) {this.total_fee = total_fee;} public String getTrade_type () {return Trade_type;} public void settrade_type (string_type) {this.trade_type = string_type = string_type = string_type = string_type = string_pee {return sign;} public void setSign (string sign) {this.sign = sign;} public String getProduct_id () {return product_id;} public void setProduct_id (string product_id) {this.product_id = product_id;} public string generatexmlcontent () {string xml = "<xml>" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " "</appid>" + "" + this.body + "" + "<diner_info> web </device_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nonce_str>" + " "</notify_url>" + "<Out_trade_no>" + this.out_trade_no + "</out_trade_no>" + "<proving_id>" + this.product_id + "</product_id>" + "<ppbill_create_ip>" + this.spbill_create_ip + " + "<total_fee>" + string.valueof (this.total_fee) + "</total_fee>" + "<trade_type>" + this.trade_type + "</trade_type>" + "<cint>" + this.sign + "</sign>" + "</xml>"; this.appid + "& body =" + this.body + "& device_info = web" + "& mch_id =" + this.mch_id + "& nonce_str =" + this.nonce_str + "? ify_url =" + this.notify_url + "& out_trade_no =" + this.out_trade_no + "& product_id_iduct_prod_idurod =" и продукт + "& spbill_create_ip =" + this.spbill_create_ip + "& total_fee =" + string.valueof (this.total_fee) + "& trade_type =" + this.trade_type; content = "& key =" + weixinconstants.md5_api_key; string = weixin "UTF-8"); return Signature.toupperCase ();}}Объяснение каждой переменной элемента можно найти в описании [единого отдельного интерфейса].
После этого нам нужно заполнить установленное нами контент, вызовать интерфейс, чтобы получить данные возврата, получить данные CODE_URL и генерировать двумерную картину на основе его, вернуть адрес изображения на веб-страницу ПК, а затем будет отображаться. Здесь мы сделаем особое примечание, что, когда мы нажмите на оплату WeChat, мы будем называть наш собственный бэкэнд -контроллер SpringMVC с помощью метода AJAX, а затем заполним единый анализ единого интерфейса WeChat через HTTPClient в соответствующем методе контроллера, чтобы получить данные XML, возвращаемые CODE_URL, а затем генерировать код QR и вернуть его на переднюю страницу. Код, реализованный в контроллере, выглядит следующим образом:
Map <string, object> result = new hashmap <string, object> (); UnifiedOrderdto dto = new UnifiedOrderdto (); if (cash == null || "" .equals (cash)) {result.put («Ошибка», «Денежные средства не могут быть нулевыми»); return;} int totalfee = 100*integer.parseInt (mase); TotalFee); DTO.SetProduct_ID (String.ValueOf (System.CurrentTimeMillis ())); DTO.SetBody ("Repair"); DTO.SetNONCE_STR (String.valueof (System.nanotime ()); logininfo LoginInfo = loginFoutil.getLoginInfo ();/////// /верее umentId uMINDID. Флаг идентификации dto.setout_trade_no («Номер вашего заказа + информация о ключе, он отправляется обратно после обратного вызова WeChat, вы можете проверить»); dto.settotal_fee (totalfee); dto.setspbill_create_ip ("127.0.0.1"); // Generate stignedto.setsign (dto. dto.makesign ()); logger.info ("xml content:" + dto.generatexmlcontent ()); try {httpclient httpclient = httpclientbuilder.create (). build (); Httppost post = new httppost (weixinconstants.unificordorder_url); post.addheader ("content-type", "text/xml; charset = utf-8"); stryentity xmlentity = new строгость (dto.generatexmlcontent (),) ContentType.text_xml); post.setentity (xmlentity); httpresponse httpresponse = httpclient.execute (post); string responsexml = entityutils.tostring (httpresponse.getentity (), "utf-8"); Code_url contentmap <string, string = ""> resultMap = (map <string, string = ">) xmlutil.doxmlparse (responsexml); logger.info (" response code_url: " + resultmap.get (" code_url ")); string codeurl = resultmap.get (" code_url "); if codeur! ! "". equals (codeUrl)) {string imageUrl = generateQrCode (codeUrl); result.put ("qrimage", imageUrl);} post.ReleAseConnection ();} catch (Exception e) {e.printstacktrace ();} result.put ("успех", "1"); result; </string,> </string,> </string, Object> </string, Object>Код, который генерирует QR -код, выглядит следующим образом:
Private String GenerateQRCode (String CodeUrl) {file folder = new File (basePath + "qrCode"); if (! foldler.exists ()) {foldler.mkdirs ();} String f_name = uuidutil.uuid () + ".png"; try {file file file (basepath + "qrcode"; fio = new FileOutputStream (f); MultiformatWriter MultiformatWriter = new MultiformatWriter (); MAP HINTS = new HashMap (); nts.put (encodehinttype.character_set, "utf-8"); // Установите набор символов кодирования типа Bitmatrix Bitmatrix = null; Bitmatrix = multiformatwriter.encode (CodeUrl, Barcodeformat.qr_code, 300, 300, подсказки); BufferedImage Image = tobufferedImage (Bitmatrix); // Вывод QR -код потока потока. f_name);} catch (Exception e1) {e1.printstacktrace (); return null;}}В настоящее время, после сканирования QR -кода WeChat на клиенте, мы будем использовать обратный вызов, чтобы сделать URL и вернуть нам данные. Мы завершим нашу собственную обработку в методе обратного вызова. Здесь важно отметить, что ваш интерфейс обратного вызова должен быть реализован с помощью метода POST HTTP, в противном случае данные XML не будут приняты. Код для обработки обратного вызова выглядит следующим образом:
@Requestmapping (value = "/your_callback_url", method = requestMethod.post) @ResponseBodyPublic void FinishPayment (httpservletrequest, httpservletresponse response) {try {logger.info ("start to wearscin server:" + recement.getlemote ("stringmap stringmap <> stringmap <> rescondemap); New HashMap <string, string = ""> (); inputStream inputStream = request.getInputStream (); // Читать входной поток SaxBuilder SaxBuilder = new SaxBuilder (); Document Document = SAXBuilder.Build (inputStream); // get letry root oom root = root root = документ. root.getChildren (); iterator it = list.iterator (); while (it.hasnext ()) {element e = (element) it.next (); string k = e.getname (); string v = ";"; список детей = e.getchildren (); if (kids.isempty ()) {v = e.getTextalize (); Xmlutil.getchildrentext (дети);} resultmap.put (k, v);} // Проверьте подпись! ! ! /*String [] keys = resultmap.keyset (). Toarray (new String [0]); Arrays.sort (keys); String kvparams = "; для (int i = 0; i <keys.length; i ++) =" "{=" "if (keys [i] .equals (" sign ") =" "containt; if (i = "=" 0) = "" kvparams = "" + = "(keys [i]" "=" + resultmap.get (keys [i]));} else {kvparams + = ("&" = "" keys [i] = "& key =" + weixinconstants.md5_api_key; Weixinpaymentutil.md5encode (esign, "utf-8"); = "" if (! Md5esign.equals (resultmap.get ("sign"))) = "" return; = ""}*= "" Close Stream = "" Free resource = "" inputStream.close (); returncode = "resultmap.get (" return_code ");" Outtradeno); = "" logger.info ("total_fee =" "nfee); =" "Процесс бизнес -обработки =" "if (" успех ".equals (returncode)) =" "todo: =" "your =" "business =" "process =" "add =" "Здесь =" " response.getWriter (). print (xmlutil.getRetresultxml (resultMap.get ("return_code"), = "" resultMap.get ("return_code"))); "" else = "" resultMap.get ("return_msg"))); "" catchexception = "" ioe) = "" ioe.print. (jdomexception = "" e1) = "" e1.printstacktrace (); = ""}Не забудьте использовать два класса Xmlutil и MD5util, используемые в официальной версии Java Demo. Демо -код можно найти на его официальной демо -странице. Соответствующие зависимости Maven следующие:
<dependency> <groupid> jdom </GroupId> jdom </artifactid> <sersion> 1.1 </version> </dependency> <Depective> <groupId> com.google.zxing </GroupId> core </artifactid> <sersion> 3.3.0 </version> </vehing>
Наконец, я должен обратить особое внимание на подпись. Я прямо скачал версию демо -программы Java с официального веб -сайта WeChat, чтобы получить подпись. Я предлагаю вам сделать то же самое, потому что это лучший выбор, чтобы гарантировать, что подпись MD5 является последовательной. Для конкретного алгоритма для создания подписей вы можете просмотреть официальный документ WeChat. Здесь мы настоятельно рекомендуем вам объяснить официальный API. 90% различных проблем, с которыми вы сталкиваетесь в разработке, связаны с тем, что вы не читаете официальные документы, но доверяете чьему -либо блогу! Это реальная цель и цель моего написания этой статьи. Согласно официальным документам, я внедрил его со своим кодом Java. Сканируйте QR -код на веб -страницах WeChat PC и оплата платежа обязательно вылетит в вашем веб -приложении.
Выше приведено реализация Java Springmvc веб -страницы PC WeChat QR -код (полная версия), введенная редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!