1. Сначала подайте заявку на разработку и применение на открытой платформе WeChat. Платформа WeChat Open сгенерирует уникальную идентификационную приложение. Поскольку требуется безопасность платежей, имя пакета приложений торговых приложений и подпись приложения должны быть связаны на открытой платформе, а платеж может быть инициирован только после ее настройки.
2. Зарегистрируйте Appid (это может быть размещено в приложении проекта)
Пакет WeChat JAR введен в проект торговых приложений. Прежде чем позвонить в API, вам нужно зарегистрировать свой Appid в WeChat. Код заключается в следующем:
Окончательный iwxapi msgapi = wxapifactory.createwxapi (контекст, null); // зарегистрировать приложение в WeChat msgapi.registerApp ("wxd930ea5d5a258f4f"); 3. Позвоните в Unified Single API, чтобы сгенерировать заказ предоплаты. После получения Prede_ID подпишите параметры и передайте их в приложение, чтобы инициировать оплату.
пример:
Номер заказа в следующем коде должен быть сгенерирован в фоновом режиме
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; Wxprepost post = new wxprepost (); post.appid = "your appid"; post.mch_id = "Ваш торговый номер"; post.nonce_str = stringutils.gennoncestr (); // случайная строка ** 1 post.body = "name продукта"; post.detail = "Описание продукта"; post.out_trade_no = out_trade_no; // Номер заказа торговца ** 2 post.total_fee = "Commodity Price"; // единица делится на post.spbill_create_ip = getlocalipaddress (); // IP -адрес ** 3 post.notify_url = ""; // Это адрес URL для Backend to Post reful post. post.sign = genpackagesign (post); // signature ** 4 list <namevaluepair> FirstSignParams = getFirstSignParams (post); String xml = toxml (FirstSignParams); String entity = null; try {entity = new String (xml.getbytes (), "iso8859-1"); byte [] buf = util.httppost (url, сущность); if (buf! = null) {string content = new String (buf); Map <string, string> map = decodexml (content); if (map! = null) {// снова подписать (поля, участвующие в подписи: Appid PartnerId PredeyId не CESTR TimeStamp Package) string appid = ""; "; String predayid = ""; String noncestr = ""; for (map.Entry <string, string> entry: map.EntrySet ()) {if ("appid" .equals (entry.getKey ())) {appid = entry.getValue (); } else if ("prepay_id" .equals (entry.getkey ())) {prepayid = entry.getValue (); } else if ("nonce_str" .equals (entry.getkey ()))) {noncestr = entry.getValue (); }} Log.d (Tag, "run ::" + appid + "/" + predayid + "/" + noncestr + "/"); String TimeStamp = String.valueof (gentiMestamp ()); // OK Получите вторичную подпись строки SecondPackAgeGagesIgn = genseCondPackagesIgn (getSecondSignParams (Appid, Predayid, noncestr, timestamp)); PayReq req = new PayReq (); req.appid = appid; req.partnerid = "Торговый номер"; req.prepayid = predayid; req.noncestr = noncestr; req.timestamp = timestamp; req.packagevalue = "sign = wxpay"; req.sign = secondpackagesign; req.extdata = "Данные приложения"; // необязательно // system.out.println ("genpackagesign3:"+post.getSign ()+"/"+secondpackagesign); // перед оплатой, если заявка не зарегистрирована в WeChat, вам следует сначала позвонить в iwxmsg.registerapp, чтобы зарегистрировать заявку на WeChat Mapi.sendreq (req); Log.d (Tag, "run:" + appid + "/" + predayid + "/" + noncestr + "/" + timestamp + "/" + secondpackagesign); }}} catch (Exception e) {} public Static Byte [] httppost (string url, string entity) {if (url == null || url.length () == 0) {log.e (Tag, "httppost, url is null"); вернуть ноль; } Httpclient httpclient = getNewhttpclient (); Httppost httppost = new httppost (url); try {httppost.setentity (new strongity (entity)); httppost.setheader ("Accept", "Application/json"); httppost.setheader ("контент-тип", "Application/json"); Httpresponse resp = httpclient.execute (httppost); if (resp.getStatUsline (). getStatusCode ()! = httpstatus.sc_ok) {log.e (Tag, "httpget Fail, code =" + resp.getStatusline (). getStatuscode ()); вернуть ноль; } return entityutils.tobytearray (resp.getentity ()); } catch (Exception e) {log.e (Tag, "httppost excection, e =" + e.getmessage ()); e.printstacktrace (); вернуть ноль; }} // Метод получения случайной строки public static string gennoncestr () {random random = new random (); return md5.getmessagedigest (string.valueof (random.nextint (10000)). getBytes ()); } Private String toxml (list <namevaluepair> params) {stringBuilder sb = new StringBuilder (); SB.Append ("<xml>"); for (int i = 0; i <params.size (); i ++) {sb.append ("<" + params.get (i) .getName () + ">"); sb.append (params.get (i) .getvalue ()); sb.append ("</" + params.get (i) .getName () + ">"); } sb.append ("</xml>"); вернуть sb.toString (); } public map <string, string> decodexml (String content) {try {map <string, string> xml = new hashmap <> (); Xmlpullparser parser = xml.newpullParser (); parser.setinput (new StringReader (Content)); int event = parser.getEventType (); while (event! = xmlpullparser.end_document) {string nodeName = parser.getName (); Switch (Event) {case xmlpullParser.start_document: break; case xmlpullparser.start_tag: if (! "xml" .equals (nodeName)) {xml.put (nodeName, parser.nexttext ()); } перерыв; case xmlpullparser.end_tag: break; } event = parser.next (); } вернуть XML; } catch (Exception e) {} return null; } @Nonnull Private List <mealsValuePair> getFirstSignParams (wxprepost params) {list <namevaluepair> packageparams = new LinkedList <> (); packageparams.add (new BasicnamevaluePair ("appid", "appid")); packageparams.add (new BasicnamevaluePair («body», params.body)); packageparams.add (new BasicnamevaluePair («Detail», Params.detail)); packageparams.add (new BasicnamevaluePair ("mch_id", "№"))); packageparams.add (new basicnamevaluepair ("nonce_str", params.nonce_str)); packageparams.add (new basicnamevaluepair ("notify_url", params.notify_url)); packageparams.add (new basicnamevaluepair ("out_trade_no", params.out_trade_no)); packageparams.add (new basicnamevaluepair ("spbill_create_ip", params.spbill_create_ip)); packageparams.add (new basicnamevaluepair ("total_fee", params.total_fee + "")); packageparams.add (new basicnamevaluepair ("trade_type", params.trade_type)); packageparams.add (new BasicnamevaluePair ("Sign", params.sign)); возврат пакетапарамс; } открытый класс wxprepost {// параметры, которые должны быть принесены с открытой строкой Appid; // Приложение Appid утверждено WeChat Open Platform Public String MCH_ID; // Номер продавца, назначенный WeChat Pay Pultive String nonce_str; // Случайная строка, не более 32 цифр. Рекомендуемый алгоритм генерации случайных чисел открытый строковый знак; // Подпись, см. Алгоритм генерации подписи открытый строковый орган; // Описание продукта Формат поля транзакции соответствует следующему формату в соответствии с различными сценариями приложений: Приложение - Имя приложения, которое необходимо передавать на рынок приложений - фактическое название продукта, Tiantian Aiing Eleminate - Recharge Game. public String out_trade_no; // номер заказа внутри торговой системы, которая может содержать буквы в пределах 32 символов. Для других инструкций см. Торговый номер заказа public int not_fee; // Общая сумма заказа в центре. Для получения подробной информации см. Сумму платежа Public String SPBILL_CREATE_IP; // фактическая IP public String notify_url; // Адрес обратного вызова для получения асинхронных уведомлений WeChat, URL -адрес уведомления должен быть непосредственно доступным URL и не может носить параметры. (Предусмотрено в фоновом режиме) Public String Trade_type; // Тип платежа // Параметры, которые не обязаны переносить открытую строку device_info; // номер устройства терминала (номер магазина или идентификатор устройства кассира), пожалуйста, передайте «Web» по умолчанию; // Имя продукта Подробнее об публичной строке ATTRACT; // Дополнительные данные, возвращенные как в API запроса и уведомление о платежах. Это поле в основном используется для пользовательских данных продавцов, несущих заказы на публичную строку fee_type; // трехзначный письменный код, который соответствует стандарту ISO 4217, по умолчанию RMB: CNY, см. Тип валюты для других списков значений для получения подробной информации // public String Time_Start; // Время генерации заказа составляет yyyymmddhhmmss, как показано в 20091225091010, как показано в 2009 году122091010. Для других деталей см. Время времени // public String Time_expire; // Время истечения срока действия заказа, формат - yyyymmddhhmmss, как показано в 2009 году1227091010 в 9:10 27 декабря 2009 года. Пожалуйста, обратитесь к правилам времени для других деталей. Примечание: минимальный интервал времени истечения срока действия должен быть больше 5 минут. Public String Goods_tag; // Параметры тегов продукта, ваучеров или скидок скидок. Для получения подробной информации, пожалуйста, обратитесь к ваучерам или скидкам скидок. // public String Limit_pay; // no_credit-Укажите, что вы не можете использовать кредитную карту для оплаты публичной строки getAppid () {return appid; } public void setAppid (string appid) {this.appid = appid; } public String getMch_id () {return 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; } public String getSign () {return Sign; } public void setSign (строковый знак) {this.sign = sign; } public String getBody () {return Body; } public void setbody (строковое тело) {this.body = body; } public String getOut_trade_no () {return out_trade_no; } public void setout_trade_no (string out_trade_no) {this.out_trade_no = out_trade_no; } public int getTotal_fee () {return total_fee; } public void cettentotal_fee (int total_fee) {this.total_fee = total_fee; } public String getSpbill_create_ip () {return spbill_create_ip; } public void setSpbill_create_ip (string spbill_create_ip) {this.spbill_create_ip = spbill_create_ip; } public String getNotify_url () {return notify_url; } public void setNotify_url (string notify_url) {this.notify_url = notify_url; } public String getTrade_type () {return trade_type; } public void settrade_type (String trade_type) {this.trade_type = trade_type; } public String getDevice_info () {return device_info; } public void setDevice_info (string device_info) {this.device_info = device_info; } public String getDetail () {return detail; } public void setDetail (String Detail) {this.detail = detail; } public String getAttach () {return attach; } public void setAttach (string attach) {this.Attach = atture; } public String getFee_type () {return fee_type; } public void setFee_type (string fee_type) {this.fee_type = fee_type; } public String getTime_Start () {return Time_Start; } public void settime_start (string time_start) {this.time_start = time_start; } public String getTime_Expire () {return Time_expire; } public void settime_expire (string time_expire) {this.time_expire = time_expire; } public String getGoods_tag () {return Goads_tag; } public void setGoods_tag (string Goald_tag) {this.goods_tag = Goods_tag; } public String getLimit_pay () {return Limit_pay; } public void setLimit_pay (string limit_pay) {this.limit_pay = limet_pay; }}Параметры, приведенные здесь, могут быть получены самими мобильными терминалами. Конечно, лучше всего предоставить нам фон по соображениям безопасности.
После завершения оплаты WeChat вызовет wxpayentryactivity. Я не буду вдаваться в подробности здесь. В документе WeChat четко указывается результаты платежа WeChat, возвращаемые в OnResp () wXpayEntryActivity (примечание: этот результат не может быть результатом того, успешно ли мы приобретаем продукт. Мы должны использовать обратный вызов WeChat в пролив Тайваня, а затем вернуться в Тайванский пролив, чтобы сообщить нам результат оплаты).
if (resp.getType () == constantApi.command_pay_by_wx) {int code = resp.errcode; Switch (Code) {case 0: log.d (Tag, "onpayfinish, errcode =" + "Pay Success"); // После успешного выплаты WeChat перейдите на фоновое место, результат оплаты, возвращаемый фоном, является основой. // Это обратный вызов после завершения оплаты WeChat. Вот запрос на фон и попросите его рассказать нам о том, является ли платеж успешным. перерыв; case -1: toast.maketext (это, "оплата не удалась 1", toast.length_short) .show (); Log.d (Tag, "onpayfinish, errcode =" + "оплата не удастся 1"); заканчивать(); перерыв; case -2: toast.makeText (это, "оплата отмена", toast.length_short) .show (); Log.d (Tag, "onpayfinish, errcode =" + "PAY CANCEL"); заканчивать(); перерыв; по умолчанию: // toast.makeText (это, "оплата не удалось 2", toast.length_short) .show (); Log.d (Tag, "onpayfinish, errcode =" + "оплата не удастся 2"); setResult (result_ok); заканчивать(); перерыв; }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.