Недавно проект требует оплаты WeChat, а затем я посмотрел на официальную оплату счета WeChat. Хотя это не сложно, на детали все еще нужно обратить внимание. Я провел большую часть дня, написав демонстрацию и полностью проверил процесс оплаты. Давайте поделимся опытом оплаты официального аккаунта WeChat ниже.
1. Настройка официальной учетной записи WeChat платеж
Нам нужно настроить официальный адрес официального платежа WeChat и тестировать белый список.
Например: адрес страницы оплаты js - http://www.xxx.com/shop/pay/
Затем здесь настроен www.xxx.com/shop/pay/
2. Процесс разработки
Заимствуйте официальную учетную запись WeChat, чтобы заплатить за API (адрес http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_4), который нам нужно разработать, помечен красным. следующее:
3. Разместите заказ с сервером WeChat
Позвоните в единый интерфейс единого интерфейса, чтобы вы могли получить Pread_id платежа WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1).
Прежде чем называть этот интерфейс, существует несколько полей, которые должны быть заполнены для оплаты H5.
3.1 Получите OpenID
Вы можете использовать форму веб -авторизации (http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
Отправить следующую ссылку в WeChat
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=url&response_type=code&scope=snsapi_base&state=123#wechat_redirect
3.2 Разместите заказ, чтобы получить Prepay_id
Код заключается в следующем, который фактически отправляет файл XML через сообщение, чтобы получить PREAN_ID, отправленный с сервера WeChat.
импортировать java.io.bytearrayinputstream; Импорт javaioioexception; Импорт javaioinputstream; Импорт javaiounsupportedencodingexception; Импорт Javautildate; Импорт javautilhashmap; Импорт Javautiliterator; Импорт JavautilMap; Импорт javautilmapentry; Импорт Javautilrandom; Импорт javaxservlethttphttpservletrequest; Импорт javaxservlethttphttpservletresponse; Импорт OrgapacheCommonScodecdigestDigestutils; Импорт orgspringframeworkstereotyotypentroller; Импорт orgspringframeworkwebbindannotationRequestmapping; Импорт orgxmlpullvxmlpullparser; Импорт orgxmlpullvxmlpullparserexception; Импорт orgxmlpullvxmlpullParserFactory; Импорт comfasterxmljacksondatabindjsonnode; импортировать comgsonoauthoauth; импортировать comgsonoauthpay; импортировать comgsonutilhttpkit; Импорт comsyutildateTimeutil; Импорт comsyutiljsonutil; @Controller @Requestmapping ("/pay") открытый класс wxpaycontroller {@requestmapping (value = "wxprepaydo") public void jspay (httpservlectrequest, httpservletresponse response, string callback) throws exception {// get out out out out string opend = sessionUtilt (straft extrabact exection exection {// get out out out out string = sessionut if (openid == null) {openid = getUseropenid (запрос); } String appid = "wx16691fcb0523c1a4"; String paternerkey = "iningfeng1234567fdfwfdfd1ss234567"; String out_trade_no = getTradeno (); Map <string, string> paramap = new hashmap <string, string> (); paramapput ("appid", appid); Paramapput («Прикрепить», «Тест»); Paramapput («Body», «Тестовая покупка»); paramapput ("mch_id", "10283271"); paramapput ("nonce_str", create_nonce_str ()); paramapput ("openid", openid); paramapput ("out_trade_no", out_trade_no); paramapput ("spbill_create_ip", getaddrip (запрос)); paramapput ("total_fee", "1"); paramapput ("trade_type", "jsapi"); paramapput ("notify_url", "http: // wwwxxxco/bank/page/wxnotify"); String sign = getsign (paramap, paternerkey); paramapput ("sign", sign); // Unified Order https: // apimchweixinqqcom/pay/Unifiedord String url = "https: // apimchweixinqccom/pay/Unifiedorder"; String xml = arraytoxml (paramap); String xmlstr = httpkitpost (url, xml); // предоплаченный идентификатор продукта string resay_id = ""; if (xmlstrindexof ("Успех")! = -1) {map <string, string> map = doxmlparse (xmlstr); prepay_id = (string) mapget ("prepay_id"); } Map <string, string> paymap = new hashmap <string, string> (); paymapput ("appid", appid); paymapput ("timeStamp", create_timestamp ()); paymapput ("noncestr", create_nonce_str ()); Paymapput ("Signtype", "MD5"); PAYMAPPUT ("Пакет", "PREAPAY_ID =" + PREAPAY_ID); String paysign = getsign (paymap, paternerkey); paymapput ("pg", Prepare_id); Paymapput («Paysign», Paysign); Webutilresponse (response, webutilpackjsonp (обратный вызов, jsonutilwarpjsonnoderesponse (jsonutiLobjecttojsonnode (paymap)) toString ())); } / ** * MAP to xml * * @param arr * @return * / public String arraytoxml (map <string, string> arr) {string xml = "<xml>"; Iterator <entry <string, string >> iter = arrentrySet () iterator (); while (iterhasnext ()) {intpirt <string, string> intry = iternext (); String key = internategekey (); String val = entrygetValue (); xml + = "<" + key + ">" + val + "</" + key + ">"; } xml += "</xml>"; вернуть XML; } // Получить OpenID Private String getUseroPenid (httpservlectrequest) throws exception {string code = requestgetParameter ("code"); if (code == null) {string openid = requestGetParameter ("openId"); вернуть OpenID; } Oauth o = new Oauth (); String token = ogettoken (code); Jsonnode node = jsonutilstringtojsonnode (token); String openId = nodeget ("openid") astext (); вернуть OpenID; } частная строка create_nonce_str () {string chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789"; String res = ""; for (int i = 0; i <16; i ++) {случайный rd = new random (); res += charscharat (rdnextint (charslength () - 1)); } return res; } частная строка getAddrip (httpservletrequest) {return requestRemoteAddr (); } частная строка create_timestamp () {return longtoString (SystemCurrentTimeMillis () / 1000); } private String getTradeno () {string timeStamp = dateTimeUtilFormatdate (new Date (), DateTimeUtIldateTime_pattern); вернуть "hzno" + timeStamp; } private String GetSign (map <string> params, string paternerkey) бросает UnsupportedEncodingException {String String1 = payCreateSign (params, false); String stringsigntemp = string1 + "& key =" + paternerkey; String SignValue = digestUtilSmd5Hex (StringsignTemp) touppercase (); вернуть SignValue; } private map <string, string> doxmlparse (string xml) бросает xmlpullparserexception, ioException {inputStream inputStream = new BytearRayInputStream (xmlgetBytes ()); Map <string, string> map = null; Xmlpullparser pullparser = xmlpullparserfactorynewinstance () newpullparser (); pullparsersetinput (inputstream, "UTF-8"); // Установить данные XML для анализа для xml int eventType = pullParSergetEventType (); while (eventtype! = xmlpullparserend_document) {switch (eventtype) {case xmlpullParserStart_document: map = new hashmap <string, string> (); перерыв; case xmlpullparserstart_tag: string key = pullparsergetname (); if (keyequals ("xml")) разрыв; String value = pullParserNextText (); maput (ключ, значение); перерыв; case xmlpullparserend_tag: break; } eventType = pullParserNext (); } return Map; }}4. Оплата H5
Оплата H5 на самом деле очень проста. Вам нужно только вызвать метод JS встроенного браузера WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_7)
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <%@ taglib prefix = "spring" uri = "http: // wwwspringframeworkorg/tags"%> <%path = requestegeGencePatepath (); String basePath = requestGetScheme () + ": //" + requestGetServerName () + ":" + requestGetServerport () + path + "/"; %> <! Doctype html public "-// w3c // dtd html 01 transitional // en" "http: // wwworg/tr/html4/loosedtd"> <html> <head> <meta charset = "utf-8"/> <meta name = "viewport". maximum-scale=0, user-scalable=0" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="format-detection" Content = "thone = no"/> <Title> Тестовая платеж </title> <link href = "/css/csss? V = 0" rel = "lelshatshipse" type = "text/css"> </head> <body> <div> <div> wechat js платежный тест </div> <ul> <li> <pap> </span> </pan> <pep> </pan </pan> <pre> <pre> <pl> <li> <li> <pap> </ppan> </pal> <pre> <pre> <pap> <pap> <pap> </pan> </pal> <pre> <pre> <ply> <li> <pap> </di li href = "javascript: pay ();"> Pay Now </a> </p> </div> </div> <script type = "text/javascript" src = "/js/zeptominjs"> </script> <script type = "text/javascript" src = "/js/commonjs"> </script> <script> <script> <script> <script> <script> <script> <script> <script> <script> <script> <script> <script> <script> <script> ""/js/jss " = urlParameter ("appid"); var TimeStamp = urlParameter ("TimeStamp"); var noncestr = urlParameter ("noncestr"); var pg = urlparameter ("pg"); var signtype = urlParameter ("Signtype"); var paysign = urlParameter ("paysign"); Функция на BridgeDeady () {weixinjsbridgeInvoke ('getBrandWcpayRequest', {"Appid": Appid, // Имя официальной учетной записи, передаваемой в "TimeStamp": TimeStamp, // TimeStamp, номер секунды с 1970 года "noncestr": noncestr, // случайная строка ":" Prepay_id = " + pg ' + pg' + pg ' + pg," noncestr ": noncestr, // randing string": "prepay_id =" + pg, " + pg," + pg, " + pg," + pg, " + pg," + pg, " + pg. Signtype, // Метод подписи WeChat: «Paysign»: PaySign // WeChat Signature}, Function (RES) {if (reserr_msg == "get_brand_wcpay_request: OK") {Alert ("Pay Succour"); успешно, но это не гарантирует, что это абсолютно надежно. } function pay () {if (typeof weixinjsbridge == "undefined") {if (documentDeventListener) {documentAdedeventListener ('weixinjsbridgeaready', onbridgeDeady, false); } else if (documentAttachevent) {documentAttachevent ('weixinjsbridgegeady', OnbridgeDeady); DocumentAttachevent ('onweixinjsbridgeready', OnbridgeDeady); }} else {OnBridgeDeady (); }} </script> </body> </html> Эффект выглядит следующим образом
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.