对接微信支付接口开发详细步骤

这篇文章是献给正在开发微信支付,但是对微信支付的流程,或是看微信支付文档有疑问的小伙伴们,我也是一枚小白,在第一次对接微信支付,也是措手不及。ok 不多说了,写的不好,大家不要喷我哈。

1、第一步

      我们需要从哪里入手,当然我们需要有微信商家账号怎样申请商家账号呢,当然还是需要有一个已经审核过的微信公众号,这样的话,首先你必须先有个审核通过的微信公众号,这里就不说怎么审核公众号了这个公众号比较好弄。

如何申请微信商户号(如图)

从微信公众号 申请商户支付账户 点击微信支付(跳转到微信支付信息填写提交)根据提示填写即可

填写好信息需要等待审核,这里就不多做解释了(下图申请成功后的截图)

当显示为审核通过会在您这边指定的邮箱里会收到如下图展示的邮件信息

现在就可以登录商户支付平台进行设定信息了(如图进行登录)

第一次需要安装证书,根据提示安装即可。安装好后点击(如下图)秘钥进行设定

设定好秘钥后要记住,这个开发的时候会使用到。

2、第二步开发(到此上面的商户号就已经可以使用了)

     创建一个WeiXinConfig.java 这里是微信的一些配置信息

 

[java] view plain copy

  1. <code class="language-java"><span>  </span>public static String key="";//上图设定好的KEY  
  2.     //网关  
  3.     public static String gatewayUrl ="https://api.mch.weixin.qq.com/pay/unifiedorder";  
  4.     //公众号ID  
  5.     public static String appid="";  
  6.     //公众账号ID  
  7.     public static String mch_id="";  
  8.     //设备号  
  9.     public static String device_info="";  
  10.     //随机字符串  
  11.     public static String nonce_str="";  
  12.     //签名  
  13.     public static String sign="";  
  14.     //签名类型  
  15.     public static String sign_type="MD5";  
  16.     //商品描述  
  17.     public static String body="";  
  18.     //商品详情  
  19.     public static String detail="";  
  20.     //附加数据  
  21.     public static String attach="";  
  22.     //商城订单号  
  23.     public static String out_trade_no="";  
  24.     //币种  
  25.     public static String fee_type="CNY";  
  26.     //交易金额(为分)例如12.53 应该(12.53*100) 放入当前值  
  27.     public static int total_fee=0;  
  28.     //客户IP  
  29.     public static String spbill_create_ip="";  
  30.     //交易起始时间yyyyMMddHHmmss  
  31.     public static String time_start="";  
  32.     //交易结束时间  
  33.     public static String time_expire="";  
  34.     //这个字段空着即可(订单优惠标记)  
  35.     public static String goods_tag="";  
  36.     //微信回调接口(重要)  
  37.     public static String notify_url="";  
  38.     //支付交易类型  
  39.     public static String trade_type="NATIVE";  
  40.     //支付订单号  
  41.     public static String product_id="";  
  42.     //指定支付方式是否限定用户用户信用卡 (这个可以空着)  
  43.     public static String limit_pay="";  
  44.     //扫描支付不需要可以空着  
  45.     public static String openid="";  
  46.     //场景信息(可以空着)  
  47.     public static String scene_info="";</code>  

   创建一个 WeiXinCommonUtil.java 名字可以随意哈。

 
  1. public static String weixinPay(String orderNumber,String clientIP,int totalFee){

  2. SortedMap<String, Object> parameters =new TreeMap<String, Object>();

  3. parameters.put("appid", WeiXinConfig.appid);

  4. parameters.put("body", WeiXinConfig.body);

  5. parameters.put("mch_id", WeiXinConfig.mch_id);

  6. parameters.put("nonce_str", WeiXinPayCommonUtil.genNonceStr());

  7. parameters.put("notify_url", WeiXinConfig.notify_url);

  8. parameters.put("out_trade_no", orderNumber);//订单号

  9. parameters.put("spbill_create_ip", clientIP);//用户IP

  10. parameters.put("total_fee", totalFee+"");//金额

  11. parameters.put("trade_type", WeiXinConfig.trade_type);

  12. //生成签名

  13. parameters.put("sign", WeiXinPayCommonUtil.createSign("UTF-8", parameters));

  14. //生成xml请求

  15. String reXml= WeiXinPayCommonUtil.getRequestXml(parameters);

  16. System.out.println(reXml);

  17. //请求xml

  18. String xml= HttpRequest.sendPost(WeiXinConfig.gatewayUrl, reXml);

  19. //解析xml

  20. String codeUrl= WeiXinXMLUtil.readCodeUrl(xml);

  21. if("error".equals(codeUrl)){

  22. return codeUrl;

  23. }

  24. return codeUrl;

  25. }

创建一个 WeiXinPayCommonUtil.java

 
  1. public static String createSign(String characterEncoding, SortedMap<String, Object> parameters) {

  2. StringBuffer sb = new StringBuffer();

  3. Set es = parameters.entrySet();

  4. Iterator it = es.iterator();

  5. while (it.hasNext()) {

  6. Map.Entry entry = (Map.Entry) it.next();

  7. String k = (String) entry.getKey();

  8. Object v = entry.getValue();

  9. if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {

  10. sb.append(k + "=" + v + "&");

  11. }

  12. }

  13. sb.append("key=" + WeiXinConfig.key);// 最后加密时添加商户密钥,由于key值放在最后,所以不用添加到SortMap里面去,单独处理,编码方式采用UTF-8

  14. String sign = WeiXinMD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();

  15. return sign;

  16. }

  17.  
  18.  
  19. public static String getRequestXml(SortedMap<String, Object> parameters) {

  20. StringBuffer sb = new StringBuffer();

  21. sb.append("<xml>");

  22. Set es = parameters.entrySet();

  23. Iterator it = es.iterator();

  24. while (it.hasNext()) {

  25. Map.Entry entry = (Map.Entry) it.next();

  26. String k = (String) entry.getKey();

  27. String v = (String) entry.getValue();

  28. if ("sign".equalsIgnoreCase(k)) {

  29.  
  30. } else if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) {

  31. sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");

  32. } else {

  33. sb.append("<" + k + ">" + v + "</" + k + ">");

  34. }

  35. }

  36. sb.append("<" + "sign" + ">" + "<![CDATA[" + parameters.get("sign") + "]]></" + "sign" + ">");

  37. sb.append("</xml>");

  38. return sb.toString();

  39. }

  40.  
  41. public static String genNonceStr() {

  42. Random random = new Random();

  43. return WeiXinMD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "");

  44. }

  45.  

创建 WeiXinMD5Util.java 

 
  1. private static String byteArrayToHexString(byte b[]) {

  2. StringBuffer resultSb = new StringBuffer();

  3. for (int i = 0; i < b.length; i++)

  4. resultSb.append(byteToHexString(b[i]));

  5.  
  6. return resultSb.toString();

  7. }

  8.  
  9. private static String byteToHexString(byte b) {

  10. int n = b;

  11. if (n < 0)

  12. n += 256;

  13. int d1 = n / 16;

  14. int d2 = n % 16;

  15. return hexDigits[d1] + hexDigits[d2];

  16. }

  17.  
  18. public static String MD5Encode(String origin, String charsetname) {

  19. String resultString = null;

  20. try {

  21. resultString = new String(origin);

  22. MessageDigest md = MessageDigest.getInstance("MD5");

  23. if (charsetname == null || "".equals(charsetname))

  24. resultString = byteArrayToHexString(md.digest(resultString.getBytes()));

  25. else

  26. resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));

  27. } catch (Exception exception) {

  28. }

  29. return resultString;

  30. }

  31.  
  32. private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d","e", "f" };


ok 到此 代码已经贴出,WeiXinConfig 返回的codeUrl 就是我们需要的这个生成一下二维码,用扫描就可以支付了。

猜你喜欢

转载自blog.csdn.net/Andrewniu/article/details/81451028