国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Heim WeChat-Applet WeChat-Entwicklung Detaillierte Erl?uterung der Java-Implementierung der WeChat-Zahlungsmethode über JsApi

Detaillierte Erl?uterung der Java-Implementierung der WeChat-Zahlungsmethode über JsApi

Mar 27, 2017 pm 01:56 PM

In diesem Artikel wird erl?utert, wie Java die WeChat-Zahlung im JsApi-Modus implementiert, und der Artikel enth?lt klare Ideen Erhalten Sie eine prepay_id von WeChat. Anschlie?end wird die Zahlung durch Aufrufen von WeChats jsapi abgeschlossen. Das Rückgabeergebnis get_brand_wcpay_request:ok wird nur zurückgegeben, wenn der Benutzer die Zahlung erfolgreich abgeschlossen hat. Aufgrund der Komplexit?t der Front-End-Interaktion k?nnen get_brand_wcpay_request:cancel oder get_brand_wcpay_request:fail einheitlich verarbeitet werden, wenn der Benutzer auf einen Fehler st??t oder freiwillig aufgibt, ohne dass die Unterscheidung verfeinert werden muss.

Der Beispielcode lautet wie folgt:


Das oben importierte Parameterpaket ist prepay_id
function?onBridgeReady(){
?WeixinJSBridge.invoke(
?'getBrandWCPayRequest',?{
??"appId"?:?"wx2421b1c4370ec43b",?//公眾號(hào)名稱,由商戶傳入?
??"timeStamp":"?1395712654",??//時(shí)間戳,自1970年以來的秒數(shù)?
??"nonceStr"?:?"e61463f8efa94090b1f366cccfbbb444",?//隨機(jī)串?
??"package"?:?"u802345jgfjsdfgsdg888",?
??"signType"?:?"MD5",??//微信簽名方式:?
??"paySign"?:?"70EA570631E4BB79628FBCA90534C63FF7FADD89"?//微信簽名?
?},
?function(res){?
??if(res.err_msg?==?"get_brand_wcpay_request:ok"?)?{}?//?使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:res.err_msg將在用戶支付成功后返回?ok,但并不保證它絕對可靠。?
?}
?);?
}
if?(typeof?WeixinJSBridge?==?"undefined"){
?if(?document.addEventListener?){
?document.addEventListener('WeixinJSBridgeReady',?onBridgeReady,?false);
?}else?if?(document.attachEvent){
?document.attachEvent('WeixinJSBridgeReady',?onBridgeReady);?
?document.attachEvent('onWeixinJSBridgeReady',?onBridgeReady);
?}
}else{
?onBridgeReady();
}

Im Folgenden geht es darum, die Parameter zum Aufrufen von jsapi abzurufen

Wenn wir JSAPI aufrufen, Wir müssen die openid des Benutzers abrufen (trade_type=JSAPI, openid ist ein erforderlicher Parameter.)

Definieren Sie zun?chst ein angefordertes
Objekt
:

Da einige Parameter erforderlich sind, und Einige Parameter sind optional. Darüber hinaus kann das Vorzeichen erst berechnet werden, wenn alle Parameter übergeben wurden. Daher wird hier der Builder-Modus verwendet. über den Builder-Modus.
package?com.unstoppedable.protocol;
import?com.unstoppedable.common.Configure;
import?com.unstoppedable.common.HttpService;
import?com.unstoppedable.common.RandomStringGenerator;
import?com.unstoppedable.common.Signature;
import?java.lang.reflect.Field;
import?java.util.HashMap;
import?java.util.Map;
public?class?UnifiedOrderReqData?{
?private?String?appid;
?private?String?mch_id;
?private?String?device_info;
?private?String?nonce_str;
?private?String?sign;
?private?String?body;
?private?String?detail;
?private?String?attach;
?private?String?out_trade_no;
?private?String?fee_type;
?private?int?total_fee;
?private?String?spbill_create_ip;
?private?String?time_start;
?private?String?time_expire;
?private?String?goods_tag;
?private?String?notify_url;
?private?String?trade_type;
?private?String?product_id;
?private?String?limit_pay;
?private?String?openid;
?private?UnifiedOrderReqData(UnifiedOrderReqDataBuilder?builder)?{
?this.appid?=?builder.appid;
?this.mch_id?=?builder.mch_id;
?this.device_info?=?builder.device_info;
?this.nonce_str?=?RandomStringGenerator.getRandomStringByLength(32);
?this.body?=?builder.body;
?this.detail?=?builder.detail;
?this.attach?=?builder.attach;
?this.out_trade_no?=?builder.out_trade_no;
?this.fee_type?=?builder.fee_type;
?this.total_fee?=?builder.total_fee;
?this.spbill_create_ip?=?builder.spbill_create_ip;
?this.time_start?=?builder.time_start;
?this.time_expire?=?builder.time_expire;
?this.goods_tag?=?builder.goods_tag;
?this.notify_url?=?builder.notify_url;
?this.trade_type?=?builder.trade_type;
?this.product_id?=?builder.product_id;
?this.limit_pay?=?builder.limit_pay;
?this.openid?=?builder.openid;
?this.sign?=?Signature.getSign(toMap());
?}
?public?void?setAppid(String?appid)?{
?this.appid?=?appid;
?}
?public?void?setMch_id(String?mch_id)?{
?this.mch_id?=?mch_id;
?}
?public?void?setDevice_info(String?device_info)?{
?this.device_info?=?device_info;
?}
?public?void?setNonce_str(String?nonce_str)?{
?this.nonce_str?=?nonce_str;
?}
?public?void?setSign(String?sign)?{
?this.sign?=?sign;
?}
?public?void?setBody(String?body)?{
?this.body?=?body;
?}
?public?void?setDetail(String?detail)?{
?this.detail?=?detail;
?}
?public?void?setAttach(String?attach)?{
?this.attach?=?attach;
?}
?public?void?setOut_trade_no(String?out_trade_no)?{
?this.out_trade_no?=?out_trade_no;
?}
?public?void?setFee_type(String?fee_type)?{
?this.fee_type?=?fee_type;
?}
?public?void?setTotal_fee(int?total_fee)?{
?this.total_fee?=?total_fee;
?}
?public?void?setSpbill_create_ip(String?spbill_create_ip)?{
?this.spbill_create_ip?=?spbill_create_ip;
?}
?public?void?setTime_start(String?time_start)?{
?this.time_start?=?time_start;
?}
?public?void?setTime_expire(String?time_expire)?{
?this.time_expire?=?time_expire;
?}
?public?void?setGoods_tag(String?goods_tag)?{
?this.goods_tag?=?goods_tag;
?}
?public?void?setNotify_url(String?notify_url)?{
?this.notify_url?=?notify_url;
?}
?public?void?setTrade_type(String?trade_type)?{
?this.trade_type?=?trade_type;
?}
?public?void?setProduct_id(String?product_id)?{
?this.product_id?=?product_id;
?}
?public?void?setLimit_pay(String?limit_pay)?{
?this.limit_pay?=?limit_pay;
?}
?public?void?setOpenid(String?openid)?{
?this.openid?=?openid;
?}
?public?Map<String, Object>?toMap()?{
?Map<String, Object>?map?=?new?HashMap<String, Object>();
?Field[]?fields?=?this.getClass().getDeclaredFields();
?for?(Field?field?:?fields)?{
??Object?obj;
??try?{
??obj?=?field.get(this);
??if?(obj?!=?null)?{
???map.put(field.getName(),?obj);
??}
??}?catch?(IllegalArgumentException?e)?{
??e.printStackTrace();
??}?catch?(IllegalAccessException?e)?{
??e.printStackTrace();
??}
?}
?return?map;
?}
?public?static?class?UnifiedOrderReqDataBuilder?{
?private?String?appid;
?private?String?mch_id;
?private?String?device_info;
?private?String?body;
?private?String?detail;
?private?String?attach;
?private?String?out_trade_no;
?private?String?fee_type;
?private?int?total_fee;
?private?String?spbill_create_ip;
?private?String?time_start;
?private?String?time_expire;
?private?String?goods_tag;
?private?String?notify_url;
?private?String?trade_type;
?private?String?product_id;
?private?String?limit_pay;
?private?String?openid;
?public?UnifiedOrderReqDataBuilder(String?appid,?String?mch_id,?String?body,?String?out_trade_no,?Integer?total_fee,
??????String?spbill_create_ip,?String?notify_url,?String?trade_type)?{
??if?(appid?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)appid不能為null");
??}
??if?(mch_id?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)mch_id不能為null");
??}
??if?(body?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)body不能為null");
??}
??if?(out_trade_no?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)out_trade_no不能為null");
??}
??if?(total_fee?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)total_fee不能為null");
??}
??if?(spbill_create_ip?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)spbill_create_ip不能為null");
??}
??if?(notify_url?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)notify_url不能為null");
??}
??if?(trade_type?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)trade_type不能為null");
??}
??this.appid?=?appid;
??this.mch_id?=?mch_id;
??this.body?=?body;
??this.out_trade_no?=?out_trade_no;
??this.total_fee?=?total_fee;
??this.spbill_create_ip?=?spbill_create_ip;
??this.notify_url?=?notify_url;
??this.trade_type?=?trade_type;
?}
?public?UnifiedOrderReqDataBuilder?setDevice_info(String?device_info)?{
??this.device_info?=?device_info;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setDetail(String?detail)?{
??this.detail?=?detail;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setAttach(String?attach)?{
??this.attach?=?attach;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setFee_type(String?fee_type)?{
??this.fee_type?=?fee_type;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setTime_start(String?time_start)?{
??this.time_start?=?time_start;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setTime_expire(String?time_expire)?{
??this.time_expire?=?time_expire;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setGoods_tag(String?goods_tag)?{
??this.goods_tag?=?goods_tag;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setProduct_id(String?product_id)?{
??this.product_id?=?product_id;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setLimit_pay(String?limit_pay)?{
??this.limit_pay?=?limit_pay;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setOpenid(String?openid)?{
??this.openid?=?openid;
??return?this;
?}
?public?UnifiedOrderReqData?build()?{
??if("JSAPI".equals(this.trade_type)?&&?this.openid?==?null)?{
??throw?new?IllegalArgumentException("當(dāng)傳入trade_type為JSAPI時(shí),openid為必填參數(shù)");
??}
??if("NATIVE".equals(this.trade_type)?&&?this.product_id?==?null)?{
??throw?new?IllegalArgumentException("當(dāng)傳入trade_type為NATIVE時(shí),product_id為必填參數(shù)");
??}
??return?new?UnifiedOrderReqData(this);
?}
?}
}

Wir w?hlen httpclient für die Netzwerkübertragung.

Dann ist da noch unser allgemeiner Eingang:
package?com.unstoppedable.common;
import?com.thoughtworks.xstream.XStream;
import?com.thoughtworks.xstream.io.xml.DomDriver;
import?com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import?org.apache.commons.logging.Log;
import?org.apache.commons.logging.LogFactory;
import?org.apache.http.HttpEntity;
import?org.apache.http.HttpResponse;
import?org.apache.http.client.ClientProtocolException;
import?org.apache.http.client.ResponseHandler;
import?org.apache.http.client.config.RequestConfig;
import?org.apache.http.client.methods.HttpGet;
import?org.apache.http.client.methods.HttpPost;
import?org.apache.http.conn.ConnectTimeoutException;
import?org.apache.http.conn.ConnectionPoolTimeoutException;
import?org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import?org.apache.http.conn.ssl.SSLContexts;
import?org.apache.http.entity.StringEntity;
import?org.apache.http.impl.client.CloseableHttpClient;
import?org.apache.http.impl.client.HttpClients;
import?org.apache.http.util.EntityUtils;
import?javax.net.ssl.SSLContext;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.IOException;
import?java.net.SocketTimeoutException;
import?java.security.KeyStore;
/**
?*?Created?by?hupeng?on?2015/7/28.
?*/
public?class?HttpService?{
?private?static?Log?logger?=?LogFactory.getLog(HttpService.class);
?private?static?CloseableHttpClient?httpClient?=?buildHttpClient();
?//連接超時(shí)時(shí)間,默認(rèn)10秒
?private?static?int?socketTimeout?=?5000;
?//傳輸超時(shí)時(shí)間,默認(rèn)30秒
?private?static?int?connectTimeout?=?5000;
?private?static?int?requestTimeout?=?5000;
?public?static?CloseableHttpClient?buildHttpClient()?{
?try?{
??KeyStore?keyStore?=?KeyStore.getInstance("PKCS12");
??FileInputStream?instream?=?new?FileInputStream(new?File(Configure.getCertLocalPath()));//加載本地的證書進(jìn)行https加密傳輸
??try?{
??keyStore.load(instream,?Configure.getCertPassword().toCharArray());//設(shè)置證書密碼
??}?finally?{
??instream.close();
??}
??//?Trust?own?CA?and?all?self-signed?certs
??SSLContext?sslcontext?=?SSLContexts.custom()
???.loadKeyMaterial(keyStore,?Configure.getCertPassword().toCharArray())
???.build();
??//?Allow?TLSv1?protocol?only
??SSLConnectionSocketFactory?sslsf?=?new?SSLConnectionSocketFactory(
???sslcontext,
???new?String[]{"TLSv1"},
???null,
???SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
??RequestConfig?requestConfig?=?RequestConfig.custom()
???.setConnectTimeout(connectTimeout)
???.setConnectionRequestTimeout(requestTimeout)
???.setSocketTimeout(socketTimeout).build();
??httpClient?=?HttpClients.custom()
???.setDefaultRequestConfig(requestConfig)
???.setSSLSocketFactory(sslsf)
???.build();
??return?httpClient;
?}?catch?(Exception?e)?{
??throw?new?RuntimeException("error?create?httpclient......",?e);
?}
?}
?public?static?String?doGet(String?requestUrl)?throws?Exception?{
?HttpGet?httpget?=?new?HttpGet(requestUrl);
?try?{
??logger.debug("Executing?request?"?+?httpget.getRequestLine());
??//?Create?a?custom?response?handler
??ResponseHandler<String>?responseHandler?=?new?ResponseHandler<String>()?{
??@Override
??public?String?handleResponse(
???final?HttpResponse?response)?throws?ClientProtocolException,?IOException?{
???int?status?=?response.getStatusLine().getStatusCode();
???if?(status?>=?200?&&?status?< 300) {
   HttpEntity entity = response.getEntity();
   return entity != null ? EntityUtils.toString(entity) : null;
   } else {
   throw new ClientProtocolException("Unexpected response status: " + status);
   }
  }
  };
  return httpClient.execute(httpget, responseHandler);
 } finally {
  httpget.releaseConnection();
 }
 }
 public static String doPost(String url, Object object2Xml) {
 String result = null;
 HttpPost httpPost = new HttpPost(url);
 //解決XStream對出現(xiàn)雙下劃線的bug
 XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
 //將要提交給API的數(shù)據(jù)對象轉(zhuǎn)換成XML格式數(shù)據(jù)Post給API
 String postDataXML = xStreamForRequestPostData.toXML(object2Xml);
 logger.info("API,POST過去的數(shù)據(jù)是:");
 logger.info(postDataXML);
 //得指明使用UTF-8編碼,否則到API服務(wù)器XML的中文不能被成功識(shí)別
 StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
 httpPost.addHeader("Content-Type", "text/xml");
 httpPost.setEntity(postEntity);
 //設(shè)置請求器的配置
 logger.info("executing request" + httpPost.getRequestLine());
 try {
  HttpResponse response = httpClient.execute(httpPost);
  HttpEntity entity = response.getEntity();
  result = EntityUtils.toString(entity, "UTF-8");
 } catch (ConnectionPoolTimeoutException e) {
  logger.error("http get throw ConnectionPoolTimeoutException(wait time out)", e);
 } catch (ConnectTimeoutException e) {
  logger.error("http get throw ConnectTimeoutException", e);
 } catch (SocketTimeoutException e) {
  logger.error("http get throw SocketTimeoutException", e);
 } catch (Exception e) {
  logger.error("http get throw Exception", e);
 } finally {
  httpPost.abort();
 }
 return result;
 }
}

Die zurückgegebene XML-Datei lautet:
package com.unstoppedable.service;
import com.unstoppedable.common.Configure;
import com.unstoppedable.common.HttpService;
import com.unstoppedable.common.XMLParser;
import com.unstoppedable.protocol.UnifiedOrderReqData;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.Map;
/**
 * Created by hupeng on 2015/7/28.
 */
public class WxPayApi {
 public static Map<String,Object>?UnifiedOrder(UnifiedOrderReqData?reqData)?throws?IOException,?SAXException,?ParserConfigurationException?{
?String?res?=?HttpService.doPost(Configure.UNIFIED_ORDER_API,?reqData);
?return?XMLParser.getMapFromXML(res);
?}
?public?static?void?main(String[]?args)?throws?Exception?{
?UnifiedOrderReqData?reqData?=?new?UnifiedOrderReqData.UnifiedOrderReqDataBuilder("appid",?"mch_id",?"body",?"out_trade_no",?1,?"spbill_create_ip",?"notify_url",?"JSAPI").setOpenid("openid").build();
?System.out.println(UnifiedOrder(reqData));
?}
}

Wenn return_code und result_code beide ERFOLGREICH sind, sind wir erfolgreich zurückgegeben Erforderliche prepay_id. . . , und verwenden Sie es dann einfach in jsapi. .
<xml>
?<return_code><![CDATA[SUCCESS]]></return_code>
?<return_msg><![CDATA[OK]]></return_msg>
?<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
?<mch_id><![CDATA[10000100]]></mch_id>
?<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
?<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
?<result_code><![CDATA[SUCCESS]]></result_code>
?<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
?<trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

Das obige ist der detaillierte Inhalt vonDetaillierte Erl?uterung der Java-Implementierung der WeChat-Zahlungsmethode über JsApi. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276