程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java經由過程JsApi方法完成微信付出

Java經由過程JsApi方法完成微信付出

編輯:關於JAVA

Java經由過程JsApi方法完成微信付出。本站提示廣大學習愛好者:(Java經由過程JsApi方法完成微信付出)文章只能為提供參考,不一定能成為您想要的結果。以下是Java經由過程JsApi方法完成微信付出正文


要應用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微信開辟技能匯總》,迎接年夜家進修浏覽。

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved