亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java通過JsApi方式實現微信支付

2019-11-26 15:03:19
字體:
來源:轉載
供稿:網友

要使用JsApi進行微信支付,首先要從微信獲得一個prepay_id,然后通過調用微信的jsapi完成支付,JS API的返回結果get_brand_wcpay_request:ok僅在用戶成功完成支付時返回。由于前端交互復雜,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以統一處理為用戶遇到錯誤或者主動放棄,不必細化區分。
示例代碼如下:

function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId" : "wx2421b1c4370ec43b", //公眾號名稱,由商戶傳入  "timeStamp":" 1395712654", //時間戳,自1970年以來的秒數  "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //隨機串  "package" : "u802345jgfjsdfgsdg888",  "signType" : "MD5", //微信簽名方式:  "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名  }, function(res){  if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判斷前端返回,微信團隊鄭重提示: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();}

以上傳入的參數package,即為prepay_id

下面講的是獲得參數來調用jsapi
我們調用JSAPI時,必須獲得用戶的openid,(trade_type=JSAPI,openid為必填參數。)
首先定義一個請求的對象:

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("傳入參數appid不能為null"); } if (mch_id == null) { throw new IllegalArgumentException("傳入參數mch_id不能為null"); } if (body == null) { throw new IllegalArgumentException("傳入參數body不能為null"); } if (out_trade_no == null) { throw new IllegalArgumentException("傳入參數out_trade_no不能為null"); } if (total_fee == null) { throw new IllegalArgumentException("傳入參數total_fee不能為null"); } if (spbill_create_ip == null) { throw new IllegalArgumentException("傳入參數spbill_create_ip不能為null"); } if (notify_url == null) { throw new IllegalArgumentException("傳入參數notify_url不能為null"); } if (trade_type == null) { throw new IllegalArgumentException("傳入參數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("當傳入trade_type為JSAPI時,openid為必填參數"); } if("NATIVE".equals(this.trade_type) && this.product_id == null) { throw new IllegalArgumentException("當傳入trade_type為NATIVE時,product_id為必填參數"); } return new UnifiedOrderReqData(this); } }}

因為有些參數為必填,有些參數為選填。而且sign要等所有參數傳入之后才能計算的出,所以這里用了builder模式。關于builder模式。

我們選用httpclient進行網絡傳輸。

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(); //連接超時時間,默認10秒 private static int socketTimeout = 5000; //傳輸超時時間,默認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()));//加載本地的證書進行https加密傳輸 try { keyStore.load(instream, Configure.getCertPassword().toCharArray());//設置證書密碼 } 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對出現雙下劃線的bug XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_"))); //將要提交給API的數據對象轉換成XML格式數據Post給API String postDataXML = xStreamForRequestPostData.toXML(object2Xml); logger.info("API,POST過去的數據是:"); logger.info(postDataXML); //得指明使用UTF-8編碼,否則到API服務器XML的中文不能被成功識別 StringEntity postEntity = new StringEntity(postDataXML, "UTF-8"); httpPost.addHeader("Content-Type", "text/xml"); httpPost.setEntity(postEntity); //設置請求器的配置 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; }}

然后是我們的總入口:

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)); }}

返回的xml為:

<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>

return_code 和result_code都為SUCCESS的時候會返回我們需要的prepay_id。。。,然后在jsapi中使用他就可以了。。

本文已被整理到了《JavaScript微信開發技巧匯總》,《Android微信開發教程匯總》,《java微信開發教程匯總》歡迎大家學習閱讀。

為大家推薦現在關注度比較高的微信小程序教程一篇:《微信小程序開發教程》小編為大家精心整理的,希望喜歡。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美久久精品一级黑人c片| 日韩欧美国产中文字幕| 最近2019中文字幕在线高清| y97精品国产97久久久久久| 欧美日韩亚洲系列| 日韩福利在线播放| 欧美性受xxxx白人性爽| 亚洲综合视频1区| 欧美黑人又粗大| 久久精品国产亚洲| 亚洲精美色品网站| 国产精品一区二区三区在线播放| 日韩av在线网址| 欧美日韩爱爱视频| 久久国产加勒比精品无码| 一区二区三区天堂av| 成人亲热视频网站| 日本一区二三区好的精华液| 91国产中文字幕| 久久精品99无色码中文字幕| 伊人精品在线观看| 国产精品久久久久久久电影| 亚洲欧美中文在线视频| 久久天天躁狠狠躁夜夜躁| 一区二区欧美久久| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品久久999| 成人免费网站在线观看| 国产精品久久久久久久天堂| 高跟丝袜欧美一区| 一区二区三区回区在观看免费视频| 欧美人与物videos| 日韩精品视频在线观看免费| 91国产视频在线播放| 日韩av在线免费播放| 精品国产精品自拍| 欧美激情第三页| 欧美中文字幕第一页| 国产精品狠色婷| 欧美性感美女h网站在线观看免费| 欧美老女人在线视频| 国产亚洲精品日韩| 91国内产香蕉| 欧美精品videossex88| 欧美性感美女h网站在线观看免费| 国产精品视频xxx| 日韩欧美在线免费| 日韩欧美国产激情| 欧美另类老肥妇| 国产香蕉精品视频一区二区三区| 欧美日韩免费一区| 亚洲精品国产美女| 国产精品美女免费看| 欧美一级大片在线免费观看| 国产97色在线| 国产精品7m视频| 久久不射电影网| 国产精品老女人精品视频| 国产精品日韩精品| 懂色av影视一区二区三区| 欧美资源在线观看| 91精品国产沙发| 亚洲精品狠狠操| 亚洲精品网站在线播放gif| 97超级碰碰人国产在线观看| 亚洲欧美制服第一页| 成人97在线观看视频| 日韩欧美成人免费视频| 国模私拍一区二区三区| 久久久久久久久久国产精品| 97久久久免费福利网址| 久久精品国产亚洲7777| 国产精品草莓在线免费观看| 国产日韩欧美综合| 久久99热精品这里久久精品| 久久国产精品久久国产精品| 日韩av免费在线观看| 欧美怡红院视频一区二区三区| 亚洲欧美日韩精品久久亚洲区| 日韩精品极品在线观看| 亚洲欧美日韩一区二区在线| 97人洗澡人人免费公开视频碰碰碰| 欧美激情亚洲国产| 亚洲小视频在线| 国产亚洲欧洲黄色| 欧美一级在线亚洲天堂| 亚洲欧洲视频在线| 日韩成人激情在线| 欧美人与性动交a欧美精品| 亚洲国产精品va在线看黑人动漫| 中文字幕日韩欧美在线| 久久亚洲精品小早川怜子66| 亚洲综合中文字幕68页| 热久久这里只有精品| 精品亚洲一区二区三区| 热re91久久精品国99热蜜臀| 日韩的一区二区| 国产一区二区欧美日韩| 91福利视频在线观看| 菠萝蜜影院一区二区免费| 日韩久久免费电影| 国产女同一区二区| 国产精品激情av电影在线观看| 亚洲国产精品推荐| 精品日韩视频在线观看| 国产成人激情小视频| 97婷婷大伊香蕉精品视频| 97色在线播放视频| 成人在线中文字幕| 亚洲男人的天堂在线播放| 亚洲精品一区中文| 国产偷国产偷亚洲清高网站| 亚洲精品网址在线观看| 成人乱色短篇合集| 国产精品久久77777| 国产欧美在线看| 国产精品精品视频| 黄色成人在线免费| 97人人模人人爽人人喊中文字| 国产一区二中文字幕在线看| 亚洲国产精品成人va在线观看| 国模精品视频一区二区三区| 亚洲成av人片在线观看香蕉| 日韩精品999| 日韩精品在线观看网站| 亚洲自拍在线观看| 97在线视频观看| 欧美日韩亚洲91| 性欧美在线看片a免费观看| 久久成人在线视频| 日韩av男人的天堂| xxx欧美精品| 91精品久久久久久久久久| 日韩精品在线免费观看| 国产剧情日韩欧美| 国产精品久久久久999| 日韩高清av一区二区三区| 欧美猛交免费看| 亚洲成人999| 亚洲欧美另类国产| 国产精品久久久久久久久免费| 日韩精品免费在线播放| 国产亚洲精品综合一区91| 久久视频免费观看| 欧美亚洲另类在线| 久久精品国产亚洲精品2020| 亚洲精品98久久久久久中文字幕| 久久综合色影院| 亚洲天堂第一页| 亚洲成色www8888| 欧美精品一区二区三区国产精品| 亚洲国产精品久久久久秋霞蜜臀| 欧美日韩在线看| 日韩毛片中文字幕| 第一福利永久视频精品| 欧美性猛交xxxx乱大交3| 欧美巨猛xxxx猛交黑人97人| 亚洲第一区在线| 91久久久久久久一区二区| 成人免费观看网址| 日韩av在线网址| 91po在线观看91精品国产性色| 欧美最猛性xxxxx免费| 亚洲激情视频在线|