微信支付java版本之Native付款

最近工作中接触到一些关于微信支付方面的东西,看到给的DEMO都是PHP版本的,再加上微信支付文档写的确实不敢恭维,趟过不少坑之后闲下来做个总结。

一、前期准备 

做微信开发首先要申请一个公共账号,申请成功后会以邮件形式发给你一些必要信息,公共账号中有开发文档以及开发中必要信息,以及测试的数据查询。

二、工具类
1.MD5加密工具类

package com.pay.utils.weixin;
import java.security.MessageDigest;
public class MD5Util {
 public final static String MD5(String s) {
    char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    try {
      byte[] btInput = s.getBytes();
      // 获得MD5摘要算法的 MessageDigest 对象
      MessageDigest mdInst = MessageDigest.getInstance("MD5");
      // 使用指定的字节更新摘要
      mdInst.update(btInput);
      // 获得密文
      byte[] md = mdInst.digest();
      // 把密文转换成十六进制的字符串形式
      int j = md.length;
      char str[] = new char[j * 2];
      int k = 0;
      for (int i = 0; i < j; i++) {
        byte byte0 = md[i];
        str[k++] = hexDigits[byte0 >>> 4 & 0xf];
        str[k++] = hexDigits[byte0 & 0xf];
      }
      return new String(str);
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
 }
}

2.CommonUtil工具类,用于装换成微信所需XML。以下return new String(xml.toString().getBytes(),"ISO8859-1");将工具类中的utf-8改成iso8859-1,否则微信订单中的中文会出现乱码,改后可以正确显示。

package com.pay.utils.weixin;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.*;
import java.util.Map.Entry;

public class CommonUtil {

 public static String CreateNoncestr(int length) {
 String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 String res = "";
 for (int i = 0; i < length; i++) {
  Random rd = new Random();
  res += chars.indexOf(rd.nextInt(chars.length() - 1));
 }
 return res;
 }

 public static String CreateNoncestr() {
 String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 String res = "";
 for (int i = 0; i < 16; i++) {
  Random rd = new Random();
  res += chars.charAt(rd.nextInt(chars.length() - 1));
 }
 return res;
 }

 public static String FormatQueryParaMap(HashMap<String, String> parameters)
  throws SDKRuntimeException {

 String buff = "";
 try {
  List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(
   parameters.entrySet());

  Collections.sort(infoIds,
   new Comparator<Map.Entry<String, String>>() {
   public int compare(Map.Entry<String, String> o1,
    Map.Entry<String, String> o2) {
    return (o1.getKey()).toString().compareTo(
     o2.getKey());
   }
   });

  for (int i = 0; i < infoIds.size(); i++) {
  Map.Entry<String, String> item = infoIds.get(i);
  if (item.getKey() != "") {
   buff += item.getKey() + "="
    + URLEncoder.encode(item.getValue(), "utf-8") + "&";
  }
  }
  if (buff.isEmpty() == false) {
  buff = buff.substring(0, buff.length() - 1);
  }
 } catch (Exception e) {
  throw new SDKRuntimeException(e.getMessage());
 }

 return buff;
 }

 public static String FormatBizQueryParaMap(HashMap<String, String> paraMap,
  boolean urlencode) throws SDKRuntimeException {

 String buff = "";
 try {
  List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(
   paraMap.entrySet());

  Collections.sort(infoIds,
   new Comparator<Map.Entry<String, String>>() {
   public int compare(Map.Entry<String, String> o1,
    Map.Entry<String, String> o2) {
    return (o1.getKey()).toString().compareTo(
     o2.getKey());
   }
   });

  for (int i = 0; i < infoIds.size(); i++) {
  Map.Entry<String, String> item = infoIds.get(i);
  //System.out.println(item.getKey());
  if (item.getKey() != "") {

   String key = item.getKey();
   String val = item.getValue();
   if (urlencode) {
   val = URLEncoder.encode(val, "utf-8");

   }
   buff += key.toLowerCase() + "=" + val + "&";

  }
  }

  if (buff.isEmpty() == false) {
  buff = buff.substring(0, buff.length() - 1);
  }
 } catch (Exception e) {
  throw new SDKRuntimeException(e.getMessage());
 }
 return buff;
 }

 public static boolean IsNumeric(String str) {
 if (str.matches("\\d *")) {
  return true;
 } else {
  return false;
 }
 }

 public static String ArrayToXml(HashMap<String, String> arr) {
 String xml = "<xml>";

 Iterator<Entry<String, String>> iter = arr.entrySet().iterator();
 while (iter.hasNext()) {
  Entry<String, String> entry = iter.next();
  String key = entry.getKey();
  String val = entry.getValue();
  if (IsNumeric(val)) {
  xml += "<" + key + ">" + val + "</" + key + ">";

  } else
  xml += "<" + key + "><![CDATA[" + val + "]]></" + key + ">";
 }

 xml += "</xml>";
  try {
  return new String(xml.toString().getBytes(),"ISO8859-1");
 } catch (UnsupportedEncodingException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
  return "";
 }

}

3.ClientCustomSSL工具类,用于生成sign以及创建微信订单package com.pay.utils.weixin;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.util.StringUtils;

/**
 * This example demonstrates how to create secure connections with a custom SSL
 * context.
 */
public class ClientCustomSSL {

 public static String GetBizSign(HashMap<String, String> bizObj)
  throws SDKRuntimeException {
 HashMap<String, String> bizParameters = new HashMap<String, String>();

 List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(
  bizObj.entrySet());
 System.out.println(infoIds);
 Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
  public int compare(Map.Entry<String, String> o1,
   Map.Entry<String, String> o2) {
  return (o1.getKey()).toString().compareTo(o2.getKey());
  }
 });
System.out.println("--------------------");
 System.out.println(infoIds);
 for (int i = 0; i < infoIds.size(); i++) {
  Map.Entry<String, String> item = infoIds.get(i);
  if (item.getKey() != "") {
  bizParameters.put(item.getKey().toLowerCase(), item.getValue());
  }
 }
 //bizParameters.put("key", "12345678123456781234567812345671");
 String bizString = CommonUtil.FormatBizQueryParaMap(bizParameters,
  false);
 bizString += "&key=12345678123456781234567812345671";
 System.out.println("***************");

 System.out.println(bizString);

// return SHA1Util.Sha1(bizString);
 return MD5Util.MD5(bizString);

 }
 /**
 * 微信创建订单
 * @param nonceStr
 * @param orderDescribe
 * @param orderNo
 * @param price
 * @param timeStart
 * @param timeExpire
 * @return
 * @throws SDKRuntimeException
 */
 public static String CreateNativePackage(String nonceStr,String orderDescribe,String orderNo,String price,String timeStart,String timeExpire) throws SDKRuntimeException {
 HashMap<String, String> nativeObj = new HashMap<String, String>();
 nativeObj.put("appid", "见公众账号");          //公众账号Id
 nativeObj.put("mch_id", "见邮件");    //商户号
 nativeObj.put("nonce_str", nonceStr);       //随机字符串
 nativeObj.put("body", orderDescribe);    //商品描述
 nativeObj.put("attach", "tradeno");    //附加数据
 nativeObj.put("out_trade_no", orderNo);          //商户订单号(全局唯一)
 nativeObj.put("total_fee", price);   //总金额(单位为分,不能带小数点)
 nativeObj.put("spbill_create_ip","192.168.0.144");     //终端Ip
 nativeObj.put("time_start", timeStart);          //交易起始时间
 nativeObj.put("time_expire", timeExpire);      //交易结束时间
 nativeObj.put("notify_url", CustomizedPropertyPlaceholderConfigurer.getContextProperty("wxurl")+"/weixin_callback/weixinCallback/init.action");                   //回调通知地址
 nativeObj.put("trade_type", "NATIVE");   //交易类型

 String sign = GetBizSign(nativeObj);

 nativeObj.put("sign", sign.toUpperCase());

 return CommonUtil.ArrayToXml(nativeObj);

 }       /**
* 微信订单支付查询
* @param nonceStr
* @param orderDescribe
* @param orderNo
* @param price
* @param timeStart
* @param timeExpire
* @return
* @throws SDKRuntimeException
*/
public static String SearchNativePackage(String transactionId,String outTradeNo,String nonceStr) throws SDKRuntimeException {
HashMap<String, String> nativeObj = new HashMap<String, String>();
nativeObj.put("appid", "见公众共账号"); //公众账号Id
nativeObj.put("mch_id", "见邮件");//商户号
nativeObj.put("nonce_str", nonceStr);//随机字符串
if(!StringUtils.isEmpty(transactionId)){
nativeObj.put("transaction_id", transactionId);
}
if(!StringUtils.isEmpty(outTradeNo)){
nativeObj.put("out_trade_no", outTradeNo);//随机字符串
}
String sign = GetBizSign(nativeObj);
nativeObj.put("sign", sign.toUpperCase());
return CommonUtil.ArrayToXml(nativeObj);
 /**
* 微信退款
* @param outTradeNo
* @param outRefundNo
 * @param totalFee
* @param refundFee
* @return
* @throws SDKRuntimeException
*/
public static String RefundNativePackage(String outTradeNo,String outRefundNo,String totalFee,String refundFee,String nonceStr) throws SDKRuntimeException {
HashMap<String, String> nativeObj = new HashMap<String, String>();
nativeObj.put("appid", "见公众账号");//公众账号Id
nativeObj.put("mch_id", "见邮件");//商户号
nativeObj.put("nonce_str", nonceStr);//随机字符串
nativeObj.put("out_trade_no", outTradeNo);//商户订单号(全局唯一)
nativeObj.put("out_refund_no", outRefundNo);//商户退款单号(全局唯一)
nativeObj.put("total_fee", totalFee);//总金额(单位为分,不能带小数点)
nativeObj.put("refund_fee", refundFee);//退款金额(单位为分,不能带小数点)
nativeObj.put("op_user_id", "邮件");
String sign = GetBizSign(nativeObj);
nativeObj.put("sign", sign.toUpperCase());
return CommonUtil.ArrayToXml(nativeObj);
}

/**
* 微信待支付
 * @param nonceStr
* @param orderDescribe
* @param orderNo
* @param price
* @param timeStart
* @param timeExpire
* @return
* @throws SDKRuntimeException
*/
public static String CreateJsApiPackage(String nonceStr,String orderDescribe,String orderNo,String price,String timeStart,String timeExpire,String openId) throws SDKRuntimeException {
HashMap<String, String> nativeObj = new HashMap<String, String>();
nativeObj.put("appid", "见公众账号");//公众账号Id
nativeObj.put("openid", openId);//公众账号Id
nativeObj.put("mch_id", "见邮件")//商户号
nativeObj.put("nonce_str", nonceStr);//随机字符串
nativeObj.put("body", orderDescribe);//商品描述
nativeObj.put("attach", "tradeno");//附加数据
nativeObj.put("out_trade_no", orderNo);//商户订单号(全局唯一)
nativeObj.put("total_fee", price);//总金额(单位为分,不能带小数点)
nativeObj.put("spbill_create_ip","192.168.0.144");//终端Ip
nativeObj.put("time_start", timeStart);//交易起始时间
nativeObj.put("time_expire", timeExpire)//交易结束时间
nativeObj.put("notify_url",CustomizedPropertyPlaceholderConfigurer.getContextProperty("wxurl")+"/weixin_callback/weixinCallback/init.action");//通知地址
nativeObj.put("trade_type", "JSAPI");//交易类型
String sign = GetBizSign(nativeObj);
nativeObj.put("sign", sign.toUpperCase());
return CommonUtil.ArrayToXml(nativeObj);
}
/**
* 微信关闭订单
* @param nonceStr
* @param orderDescribe
* @param orderNo
* @param price
* @param timeStart
* @param timeExpire
* @param openId
* @return
* @throws SDKRuntimeException
*/
public static String CreateCloseOrder(String outTradeNo,String nonceStr) throws SDKRuntimeException {
HashMap<String, String> nativeObj = new HashMap<String, String>();
nativeObj.put("appid", "见公众账号");//公众账号Id
nativeObj.put("mch_id", "见邮件");//商户号
nativeObj.put("out_trade_no", outTradeNo);//商户订单号(全局唯一)
nativeObj.put("nonce_str", nonceStr);//随机字符串
 String sign = GetBizSign(nativeObj);
nativeObj.put("sign", sign.toUpperCase());
 return CommonUtil.ArrayToXml(nativeObj);
}
}

4.调用微信支付接口

package com.pay.controller.weixin;

import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.net.ssl.SSLContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
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 org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.pay.bo.PayHist;
import com.pay.constants.PayHistoryPayStatus;
import com.pay.constants.PayHistoryPayType;
import com.pay.service.WeiXinPayService;
import com.pay.utils.weixin.ClientCustomSSL;
import com.pay.utils.weixin.CloseWeiXinOrderUtils;
import com.pay.utils.weixin.CustomizedPropertyPlaceholderConfigurer;

@RestController
@RequestMapping("/Pay")
public class WeiXinPayController {

 @Autowired
 WeiXinPayService weiXinPayService;
 private static long standardTime = 1662652800000L;

 /**
 * 返回生成二维码的url
 * @param request
 * @param response
 * @return
 */
 @RequestMapping(value="/getUrl",method=RequestMethod.POST)
 @ResponseStatus(HttpStatus.OK)
 public Object getUrl(HttpServletResponse response,@RequestBody String body){
 try{
  JSONObject jsonO = JSONObject.fromObject(body);
  PayHist ph = null;
//  List<Map<String,Object>> td = weiXinPayService.getTrade(orderNo);
  Date dt = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  String nonceStr = sdf.format(dt).toString();
  Date now = new Date();

  String tradePayNo = jsonO.get("orderNo").toString()+String.format("%10d",standardTime - now.getTime()).substring(0, 10);
  System.out.println("订单标号orderNo======="+jsonO.get("orderNo").toString());
  System.out.println("10位随机数======="+String.format("%10d",standardTime - now.getTime()).substring(0, 10));
  String price = Math.round(Float.valueOf(jsonO.get("price").toString())*100)+"";
  Long timeExpireStrOld = dt.getTime();
  Long timeNew = Long.parseLong(CustomizedPropertyPlaceholderConfigurer.getContextProperty("weixin.send2finish.overtime").toString());
  Long timeExpireNew = timeExpireStrOld+timeNew;
  Date dtTimeExpire = new Date(timeExpireNew);
  SimpleDateFormat dtSdf = new SimpleDateFormat("yyyyMMddHHmmss");
  String timeExpire = dtSdf.format(dtTimeExpire).toString();
  System.out.println("nonceStr=="+nonceStr);
  System.out.println("orderNo=="+jsonO.get("orderNo").toString());
  System.out.println("price=="+price);
  System.out.println("timeStart=="+nonceStr);
  System.out.println("timeExpire=="+timeExpire);

  JSONObject result = (JSONObject) setUrl(nonceStr,"订单",tradePayNo,price,nonceStr,timeExpire);

  if(result.get("status").toString().equals("success")){
  ph = new PayHist();
  ph.setTradePayUrl(result.getString("weixinPayUrl"));//此字段为支付链接,可以此链接生成二维码扫码支付
  ph.setPayTradeNo(jsonO.get("orderNo").toString());
  ph.setTradePayNo(tradePayNo);
  ph.setPayStatus(PayHistoryPayStatus.WECHAT_PAY_STATUS_WAIT);
  ph.setPayType(PayHistoryPayType.WECHAT);
  ph.setAppKey(jsonO.getString("appKey").toString());
  ph.setPayAmount(price);

  result.put("payTradeNo", ph.getPayTradeNo());
  result.put("tradePayNo", ph.getTradePayNo());
  result.put("payStatus", ph.getPayStatus());
  result.put("payType", ph.getPayType());

  }
  return result;

 }catch(Exception e){
  e.printStackTrace();
  JSONObject result = new JSONObject();
  result.put("status","error");
  result.put("msg",e.getMessage());
//  return result.toString();
 }
 return null;

 }

 public Object setUrl(String nonceStr,String orderDescribe,String orderNo,String price,String timeStart,String timeExpire) {
 try{

  KeyStore keyStore = KeyStore.getInstance("PKCS12");
  FileInputStream instream = new FileInputStream(new File(微信证书绝对路径));
  try {
  keyStore.load(instream, "商户ID".toCharArray());
  }finally {
  instream.close();
  }

  // Trust own CA and all self-signed certs
  SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore,<span style="font-family: Arial, Helvetica, sans-serif;">商户ID</span>.toCharArray()).build();
  // Allow TLSv1 protocol only
  SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
   sslcontext, new String[] { "TLSv1" }, null,
   SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  CloseableHttpClient httpclient = HttpClients.custom()
   .setSSLSocketFactory(sslsf).build();
  // HttpGet httpget = new
  // HttpGet("https://api.mch.weixin.qq.com/secapi/pay/refund");
  HttpPost httppost = new HttpPost(
   "https://api.mch.weixin.qq.com/pay/unifiedorder");

  String xml = ClientCustomSSL.CreateNativePackage(nonceStr,orderDescribe,orderNo,price,timeStart,timeExpire);
  try {

  StringEntity se = new StringEntity(xml);

  httppost.setEntity(se);

  System.out.println("executing request" + httppost.getRequestLine());

  CloseableHttpResponse responseEntry = httpclient.execute(httppost);
  try {
   HttpEntity entity = responseEntry.getEntity();

   System.out.println("----------------------------------------");
   System.out.println(responseEntry.getStatusLine());
   if (entity != null) {
   System.out.println("Response content length: "
    + entity.getContentLength());
  /* BufferedReader bufferedReader = new BufferedReader(
    new InputStreamReader(entity.getContent()));
   String text;
   while ((text = bufferedReader.readLine()) != null) {
    System.out.println("======="+text);
   }*/ 

   SAXReader saxReader = new SAXReader();
   Document document = saxReader.read(entity.getContent());
   Element rootElt = document.getRootElement();
   System.out.println("根节点:" + rootElt.getName());
   System.out.println("==="+rootElt.elementText("result_code"));
   System.out.println("==="+rootElt.elementText("return_msg"));
   String resultCode = rootElt.elementText("result_code");
   JSONObject result = new JSONObject();  

   Document documentXml =DocumentHelper.parseText(xml);
   Element rootEltXml = documentXml.getRootElement();

   if(resultCode.equals("SUCCESS")){
    System.out.println("=================prepay_id===================="+ rootElt.elementText("prepay_id"));
    System.out.println("=================sign===================="+ rootEltXml.elementText("sign"));
    result.put("weixinPayUrl", rootElt.elementText("code_url"));
    result.put("prepayId", rootElt.elementText("prepay_id"));
    result.put("status","success");
    result.put("msg","success");
   }else{
    result.put("status","false");
    result.put("msg",rootElt.elementText("err_code_des"));
   }

   return result;

   }
   EntityUtils.consume(entity);
  }
  finally {
   responseEntry.close();
  }
  }
  finally {
  httpclient.close();
  }
  return null;

 }catch(Exception e){
  e.printStackTrace();
  JSONObject result = new JSONObject();
  result.put("status","error");
  result.put("msg",e.getMessage());
  return result;
 }
 }

}

httpclient  jar包和json jar包:下载地址。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java的几个重要版本_动力节点Java学院整理

    java几个重大版本 java从1995年发布到现在,也走过18年了,个人认为,其中几个java版本都肩负着重大使命,影响甚远: jdk1.0 1995年5月23日诞生,Oak语言改名为Java,并提出"Write Once ,Run anywhere": jdk1.2  1999年6月发布,将java划分为J2SE,J2ME,J2EE三大平台: jdk1.4 主要是性能提升,在2000年时候JAVA成为世界上最流行的电脑语言,跟这个版本离不开关系,估计国内还有大量的java应用是运行

  • 微信支付java版本之查询订单

    本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; import java.io.File; import java.io.FileInputStream; import java.security.KeyStore; import java.text.SimpleDateFormat; import java.util.Date; import

  • Java程序实现导出Excel的方法(支持IE低版本)

    今天想整理一下自己前段时间遇到的一个导出的问题. 因为项目的需求,要做一部分导出功能.开始的时候用的公司的导出,但是很奇怪有部分模块导出的时候就是会报500错误,发现在删减一些字段后就恢复了正常,当时因为项目紧张,也就临时删减了一些,但也不是长久之计,之后自己在原本的基础上重新修改整理了一下,目前运行还算稳定,就此和大家分享一下. 导出需要三个部分,js,公共方法,后台方法. js代码 function exportData() { //前台接收的参数 rwmc = $("#txt_rwmc&q

  • Mac下设置Java默认版本的方法

    本文先是给给大家介绍了切换Java版本的方法,而后又介绍了如何实现永久生效,下面话不多说,一起来看详细的步骤吧. 之前Mac下Java的版本是1.7. java -version java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b14) Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) 安装了1.8版本后,执行Ja

  • 查看Java所支持的语言及相应的版本信息

    /* *Java语言作为第一种支持国际化的语言,在Internet从一开始就具有其他语言无与伦比的国际化的本质特性:*用Unicode来编写所有的字符串.可是理论与实际总是不能完全谋和的,因为Unicode本身也在不断变化.* 在J2SE(TM) 5.0中,主要的变化是对java.lang,java.text, java.util.regex等包进行调整,使整个字*符处理基于Unicode4.0的标准之上,同时加强了对增补字符的支持(欲了解更多信息请参照:* <Supplementary Cha

  • 基于JAVA代码 获取手机基本信息(本机号码,SDK版本,系统版本,手机型号)

    老风格,废话不多说了,直接给大家贴java代码了. 代码如下: package com.zzw.getPhoneInfos; import android.app.Activity; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.telephony.TelephonyManager; import android.util.Log; public

  • 使用Java代码来比较Android客户端版本号

    关键点 为什么不能使用String.compareTo方法来比较客户端版本号? 举个例子,之前客户端版本号为:9.9.9,而服务器端最新的客户端版本号为:10.0.1,虽然10.0.1明显高于9.9.9,但是按照compareTo方法,这个9.9.9是大于10.0.1的,导致客户端版本号比较错误. Java代码实现 扯了一些,最后还是要show一下代码的,以下是我的客户端版本号比较代码,欢迎吐槽. public static int compareVersion(String version1,

  • 微信支付java版本之Native付款

    最近工作中接触到一些关于微信支付方面的东西,看到给的DEMO都是PHP版本的,再加上微信支付文档写的确实不敢恭维,趟过不少坑之后闲下来做个总结. 一.前期准备  做微信开发首先要申请一个公共账号,申请成功后会以邮件形式发给你一些必要信息,公共账号中有开发文档以及开发中必要信息,以及测试的数据查询. 二.工具类 1.MD5加密工具类 package com.pay.utils.weixin; import java.security.MessageDigest; public class MD5U

  • 微信支付java版本之JSAPI支付+发送模板消息

    本文为大家分享了java版本之JSAPI支付+发送模板消息的相关资料,供大家参考,具体内容如下 1.工具类 工具类见:微信支付JAVA版本之Native付款 2.公众账号设置 3.代码实现 openId:openId为用户与该公众账号之间代表用户的唯一标示  以下类中涉及到生成token,关闭订单接口调用,获取配置文件信息,和工具类,在其他文章中有具体代码实现 package com.zhrd.bussinss.platform.controller.rest; import java.io.F

  • 微信支付java版本之获取Access_token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效. 公众平台的API调用所需的access_token的使用及生成方式说明: 1.为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器.而其他业务逻辑服务器所使用的ac

  • 微信支付java版V3验证数据合法性(Deom)

    1.1 解析微信回调数据 InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } o

  • golang实现微信支付v3版本的方法

    一.准备阶段 获取私钥 官方文档 https://kf.qq.com/faq/161222N... 获取私钥证书的序列号 https://pay.weixin.qq.com/wik... openssl x509 -in 1900009191_20180326_cert.pem -noout -serial serial=1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C 私钥获取后有三个文件 apiclient_key.p12 apiclient_cert.pem

  • 微信支付开发动态链接Native支付

    注意: 微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版.V3版的微信支付没有paySignKey参数.v2的相关介绍请参考方倍工作室的其他文章.本文介绍的为微信支付v3. 一.生成商品信息 动态链接支付过程中,是先生成商品交易进行,再来进行支付交易的. 1. 商品信息准备 主要是先定义商品的名称及价格,以及交易号.代码如下. include_once("../WxPayPubHelper/WxPayPubHelper.php"); //使用统

  • android端微信支付V3版本地签名统一下单详解

    满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url.微信的支付demo并没有统一下单的代码. 读此文前先阅读: https://pay.weixin.qq.com/wiki/doc/api/app/app.PHP?chapter=9_1 一步步的来  先根据统一下单的参数介绍工具: 1. 获取到当前的ip: <span style="font-size:14px;">public String getLocalIpAddress() { try { f

  • Spring Boot中的微信支付全过程(小程序)

    目录 前言 一.申请流程和步骤 二.注册商家 2.1商户平台 2.2商户id 三.API私钥(支付密钥) 四.商户签约微信支付产品 五.配置回调地址 六.小程序获取APPID 七.微信支付与小程序绑定 八.实战部分 8.1SpringBoot框架搭建 8.2微信支付相关接口 8.2.1小程序用户登录接口 8.2.2统一下单接口 8.2.3创建订单接口 8.2.4取消订单接口 8.2.5订单详情接口 8.2.6支付回调接口 前言 微信支付是企业级项目中经常使用到的功能,作为后端开发人员,完整地掌握

  • 解决iOS调起微信支付显示系统繁忙问题

    最新刚到新公司接手一个项目,当微信支付时可以跳转到微信界面,但会弹出对话框显示 '系统繁忙',点击确定就留在微信,不返回APP,然后就各种调试,微信的DEMO和接入文档都看穿了,都还没能解决问题,网上也是找了各种答案,什么降低微信支付SDK版本,还有检查传过去的参数,也反复检查了参数,确实没发现问题,也没能解决我的问题,安卓那边可以微信支付,iOS这边不行,参数都是由服务器返回的一样的参数,所以也解决参数不会有问题,然后无意中看到了网上一个哥们的问题说和友盟分享SDK冲突了,刚好这个工程也集成了

随机推荐