休息食客

随心而动

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  16 随笔 :: 7 文章 :: 2 评论 :: 0 Trackbacks

2015年9月14日 #

当请求结束后,会受到微信服务器返回给我们的结果
处理第三节中的reback
//将接收到的返回信息
  Map<String,Object> mso = new HashMap<String,Object>();
   mso = XMLParser.getMapFromXML(reback);
需要抓取异常
写一个XMLParser类
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
 * User: rizenguo
 * Date: 2014/11/1
 * Time: 14:06
 */
public class XMLParser {
    public static Map<String,Object> getMapFromXML(String xmlString) throws ParserConfigurationException, IOException, SAXException {
        //这里用Dom的方式解析回包的最主要目的是防止API新增回包字段
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputStream is =  Util.getStringStream(xmlString);
        Document document = builder.parse(is);
        //获取到document里面的全部结点
        NodeList allNodes = document.getFirstChild().getChildNodes();
        Node node;
        Map<String, Object> map = new HashMap<String, Object>();
        int i=0;
        while (i < allNodes.getLength()) {
            node = allNodes.item(i);
            if(node instanceof Element){
                map.put(node.getNodeName(),node.getTextContent());
            }
            i++;
        }
        return map;
    }
   
}
好吧,到这里,已经将结果都放入一个map里面去了,,笔者自己写了一个返回类,把map里的结果都set到返回类中,
最终都返回给调用这个现金红包接口的其他业务。
大家可以参考一下
写一个WechatCashHongbaoSendRsp类
public class WechatCashHongbaoSendRsp {
 
 private String return_code;                 //返回状态码
 private String return_msg;                  //返回信息
 
 //以下字段在return_code为SUCCESS的时候有返回
 private String sign;                        //签名
 private String result_code;                 //业务结果
 private String err_code;                    //错误代码
 private String err_code_des;                //错误代码描述
 
 //以下字段在return_code和result_code都为SUCCESS的时候有返回
 private String mch_billno;                  //商户订单号
 private String mch_id;                      //商户号
 private String wxappid;                     //公众账号appid
 private String re_openid;                   //用户openid
 private String total_amount;                //付款金额
 private String send_time;                   //发放成功时间
 private String send_listid;                 //微信单号
 
 public String getReturn_code() {
  return return_code;
 }
 public void setReturn_code(String return_code) {
  this.return_code = return_code;
 }
 public String getReturn_msg() {
  return return_msg;
 }
 public void setReturn_msg(String return_msg) {
  this.return_msg = return_msg;
 }
 public String getSign() {
  return sign;
 }
 public void setSign(String sign) {
  this.sign = sign;
 }
 public String getResult_code() {
  return result_code;
 }
 public void setResult_code(String result_code) {
  this.result_code = result_code;
 }
 public String getErr_code() {
  return err_code;
 }
 public void setErr_code(String err_code) {
  this.err_code = err_code;
 }
 public String getErr_code_des() {
  return err_code_des;
 }
 public void setErr_code_des(String err_code_des) {
  this.err_code_des = err_code_des;
 }
 public String getMch_billno() {
  return mch_billno;
 }
 public void setMch_billno(String mch_billno) {
  this.mch_billno = mch_billno;
 }
 public String getMch_id() {
  return mch_id;
 }
 public void setMch_id(String mch_id) {
  this.mch_id = mch_id;
 }
 public String getWxappid() {
  return wxappid;
 }
 public void setWxappid(String wxappid) {
  this.wxappid = wxappid;
 }
 public String getRe_openid() {
  return re_openid;
 }
 public void setRe_openid(String re_openid) {
  this.re_openid = re_openid;
 }
 public String getTotal_amount() {
  return total_amount;
 }
 public void setTotal_amount(String total_amount) {
  this.total_amount = total_amount;
 }
 public String getSend_time() {
  return send_time;
 }
 public void setSend_time(String send_time) {
  this.send_time = send_time;
 }
 public String getSend_listid() {
  return send_listid;
 }
 public void setSend_listid(String send_listid) {
  this.send_listid = send_listid;
 }
}
将map里的值都set进来
WechatCashHongbaoSendRsp rsp = new WechatCashHongbaoSendRsp();
  rsp.setReturn_code(String.valueOf(mso.get("return_code")));
  rsp.setReturn_msg(String.valueOf(mso.get("return_msg")));
 
  //以下字段在return_code为SUCCESS的时候有返回
  if(String.valueOf(mso.get("return_code")).equals("SUCCESS")){
   rsp.setSign(String.valueOf(mso.get("sign")));
   rsp.setResult_code(String.valueOf(mso.get("result_code")));
   rsp.setErr_code(String.valueOf(mso.get("err_code")));
   rsp.setErr_code_des(String.valueOf(mso.get("err_code_des")));
   
   //以下字段在return_code为SUCCESS的时候有返回
   if(String.valueOf(mso.get("result_code")).equals("SUCCESS")) {
    rsp.setMch_billno(String.valueOf(mso.get("mch_billno")));
    rsp.setMch_id(String.valueOf(mso.get("mch_id")));
    rsp.setWxappid(String.valueOf(mso.get("wxappid")));
    rsp.setRe_openid(String.valueOf(mso.get("re_openid")));
    rsp.setTotal_amount(String.valueOf(mso.get("total_amount")));
    rsp.setSend_time(String.valueOf(mso.get("send_time")));
    rsp.setSend_listid(String.valueOf(mso.get("send_listid")));
   }
  }
将此结果返回出去吧!
声明:工具类代码参考微信支付开发的demo,有些自己做了小改动。

最后说一点点,开发这个应用接口,除了在加载证书那里遇到困难,其他地方还是比较顺利的,然后笔者写这篇博客,希望将
自己的研究的东西分享出去,有哪些不对的地方,或者不好的地方,请指教,毕竟当局者迷旁观者清。
posted @ 2015-09-15 11:44 休息食客 阅读(298) | 评论 (0)编辑 收藏

当把要发送的数据准备好之后,接下来是要写https请求,把它发送给微信服务器
String reback = HttpClientUtil.sendHttpsUrl("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", data);
需要抓取异常,并处理好异常
写一个HttpClientUtil类
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import com.yxht.core.common.tools.LoadProperties;
import com.yxht.core.modules.WechatPay.client.TenpayHttpClient;
/**
 * Http客户端工具类<br/>
 * 这是内部调用类,请不要在外部调用。
 * @author miklchen
 *
 */
public class HttpClientUtil {
 
 /**
  * 发送请求(微信支付用,发红包等等)
  * @param url
  * @param params
  * @return
  * @throws Exception
  */
 public static String sendHttpsUrl(String sendUrl, String params) throws Exception{
  String jsonStr = "";
  String certificate_path = "d\:\\rootca.pem"; //信任库证书
  String keystore_path = "d\:\\apiclient_cert.p12"; //密钥库证书
  String password = "xxxxxxxx"; //商户号,也是加载证书的密码
 
  // 声明SSL上下文  
        SSLContext sslContext = null;  
        // 实例化主机名验证接口  
        sslContext = getSSLContext(password, keystore_path, certificate_path);  
        if (sslContext != null) {  
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext  
                    .getSocketFactory());  
        }  
  URL url = new URL(sendUrl);
  HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
  con.setRequestMethod("POST");
  con.setDoOutput(true);
  con.setDoInput(true);
  con.setUseCaches(false);
  //设置套接工厂
  con.setSSLSocketFactory(sslContext.getSocketFactory());
  OutputStreamWriter writer = new OutputStreamWriter(
    con.getOutputStream(), "UTF-8");
  writer.write(params);
  writer.flush();
  writer.close();
  InputStream in = con.getInputStream();
  BufferedReader db = new BufferedReader(new InputStreamReader(in, "UTF-8"));
  String tmp = "";
  while ((tmp = db.readLine()) != null) {
   jsonStr += tmp;
  }
  return jsonStr;
 
 }
 
 /**
     * 获得SSLSocketFactory.
     * @param password
     *            密码
     * @param keyStorePath
     *            密钥库路径
     * @param trustStorePath
     *            信任库路径
     * @return SSLSocketFactory
     * @throws Exception
     */  
    public static SSLContext getSSLContext(String password,  
            String keyStorePath, String trustStorePath) throws Exception {  
        // 实例化密钥库  
        KeyManagerFactory keyManagerFactory = KeyManagerFactory  
                .getInstance(KeyManagerFactory.getDefaultAlgorithm());  
        // 获得密钥库  
        KeyStore keyStore = getKeyStore(password, keyStorePath);  
        // 初始化密钥工厂  
        keyManagerFactory.init(keyStore, password.toCharArray());  
 
        // 实例化信任库  
//        TrustManagerFactory trustManagerFactory = TrustManagerFactory  
//                .getInstance(TrustManagerFactory.getDefaultAlgorithm());  
//        // 获得信任库  
//        KeyStore trustStore = getKeyStore(password, trustStorePath);  
//        // 初始化信任库  
//        trustManagerFactory.init(trustStore);  
        // 实例化SSL上下文  
        SSLContext ctx = SSLContext.getInstance("TLS");  
        // 初始化SSL上下文  
        ctx.init(keyManagerFactory.getKeyManagers(),  
                null, null);  
        // 获得SSLSocketFactory  
        return ctx;  
    }  
   
    /**
     * 获得KeyStore.
     * @param keyStorePath
     *            密钥库路径
     * @param password
     *            密码
     * @return 密钥库
     * @throws Exception
     */  
    public static KeyStore getKeyStore(String password, String keyStorePath)  
            throws Exception {  
        // 实例化密钥库  
        KeyStore ks = KeyStore.getInstance("PKCS12");  
        // 获得密钥库文件流  
        FileInputStream is = new FileInputStream(keyStorePath);  
        // 加载密钥库  
        ks.load(is, password.toCharArray());  
        // 关闭密钥库文件流  
        is.close();  
        return ks;  
    }  
}
有些import的没用,可以删掉,只要程序代码没有报错的地方就行。
到这里,如果发送请求,会失败,它会说你没有安装证书,到商户平台上去下载证书,文档里有说明
下载后一共有4个证书,至少需要密钥库证书apiclient_cert.p12,因为信任库证书rootca.pem我不会用(哪位大神会用教教我),
文档里也说了信任库证书不用也行,证书安装请仔细研究文档,代码上面已经写好了。

最后最后,,请发送请求吧!!!

声明:工具类代码参考微信支付开发的demo,有些自己做了小改动。

PS:需要引入http相关jar包,httpcore-4.2.3.jar,httpmine-4.2.3.jar,httpclient-4.2.3.jar,httpclient-cache-4.2.3.jar。一样,
还是去https://repository.sonatype.org里面找吧,如果是maven建立的项目,就把他们引入到pom.xml里面去吧!
posted @ 2015-09-14 12:23 休息食客 阅读(349) | 评论 (0)编辑 收藏