首页 > 公众号 > 微信交易单号尾号算法如何实现?分析微信单号尾数规律

微信交易单号尾号算法如何实现?分析微信单号尾数规律

发布:2018-02-14 22:24:17来源:柯阅读:170

  如今,大多数人都是通过微信来进行付款交易的,我们在通过微信交易完后都会受到一个微信交易单号,这一交易单号可以显示我们所汇款的内容金额,可以及时的进行核对。对此大家可知道微信交易单号尾号算法如何实现?接下来小编就为大家分析微信交易单号尾数规律。

  微信开发中,涉及到微信支付流程较为繁琐。其中以微信红包为例,参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3。

  调用微信支付链接中,有以下三个字段,需要依据相关算法要求生成。分别是签名(sign),订单号(mch_billno)以及随机字符串(nonce_str)。下面用Java依据算法流程,实现了微信支付工具类,用于生成上述三个字段。

  代码如下,已经过测试

  /**

  * Created by Song on 2016/11/8.

  * mail: 1147649695@qq.com

  * 微信支付相关工具类

  */

  public class PayWxUtil {

  //上一次订单请求日期

  private static Date preDay = new Date();

  //当前订单日期

  private static Date curDay = new Date();

  //用于记录已产生的订单号

  private static Set numPoul = new HashSet();

  /**

  * 获得签名

  * @param params 待编码参数,参数值为空不传入

  * @param key key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

  * @return

  */

  public static String getSign(Map params,String key){

  List list = new ArrayList(params.keySet());

  Collections.sort(list,new DictionaryCompare());

  StringBuffer sb = new StringBuffer();

  for(String keyVal:list){

  sb.append(keyVal+"="+params.get(keyVal)+"&");

  }

  sb.append("key="+key);

  return DigestUtils.md5Hex(sb.toString()).toUpperCase();

  }

  /**

  * 获得随机字符串

  * @return

  */

  public static String getNonceStr(){

  Random random = new Random();

  long val = random.nextLong();

  String res = DigestUtils.md5Hex(val+"yzx").toUpperCase();

  if(32

  else return res;

  }

  /**

  * 获取订单号

  * 商户订单号(每个订单号必须唯一)

  * 组成:mch_id+yyyymmdd+10位一天内不能重复的数字。

  * @param mchId

  * @return

  */

  public static String getMchBillno(String mchId){

  Random random = new Random();

  long val = random.nextLong()%10000000000L;//获得0-9999999999内的数字

  curDay = new Date();

  //隔天清空

  if(curDay.after(preDay)) numPoul.clear();

  while(numPoul.contains(val)){

  val = random.nextLong()%10000000000L;

  }

  numPoul.add(val);

  preDay = curDay;

  //按要求,日期格式化输出

  DateFormat df = new SimpleDateFormat("yyyymmdd");

  return mchId+df.format(curDay)+format(val+"",10);

  }

  /**

  * 将字符串str按长度在前面添0补齐

  * @param str

  * @param length

  * @return

  */

  private static String format(String str,int length){

  String pre = "0000000000";

  int len = str.length();

  if(10<=len) return str.substring(0,10);

  else return pre.substring(0,10-len).concat(str);

  }

  }

  /**

  * 按字典序排序

  */

  class DictionaryCompare implements Comparator{

  public int compare(String o1, String o2) {

  return o1.compareTo(o2);

  }

  }

  程参考官方说明签名算法其具体实现过程摘录如下:

  (1)设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA

  (2)在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

  关于订单号生成,要求订单号后10位为当天不可重复的10位数。这里用静态Set存储了当天已产生的数字。需要说明的是,这种方式下,如果项目在服务器下重新部署了,该静态值将被清空,从而有可能导致错误;当一天内访问量很高,接近上限值9999999999时,获得该随机数的时间将显著增长,且将耗费JVM中永久区较大内存资源,若JVM相关参数配置不当,可能导致PermSize溢出异常,导致系统崩溃。这两种情况下,建议还是采用基于数据库字段自增来获取该值为好。当然,目前这种方式基于本次项目日红包发送量较低的情况,所以不需考虑以上情况。具体实现方式是:

  (1)产生0-9999999999类的随机数

  (2)判断当前日期curDay是否在上一次请求日期preDay之后,是则执行(3),否则执行(4)

  (3)清空随机数静态缓存numPoul

  (4)判断该随机数是否在静态缓存资源numPoul中,存在则执行(1),否则执行(5)

  (5)将该随机数写入numPoul中,更新preDay为当前日期

  (6)将该随机数添0补齐为10位,并按规则组合,得到订单号并返回。

  我们在微信交易后所获得的微信交易单号,其尾号也是有规律的,大家都知道吗?那么微信交易单号尾号算法是如何实现的呢?以上便是小编为大家分析的微信交易单号尾号的规律原理。如果想要了解更多关于微信公众号的内容,请多多关注微微风

  相关推荐:

  流动字幕的微信小程序实现技巧

  微信公众号文章尾部关注如何实现?

  微信个性签名怎么切换下一排?如何实现这个操作?


发表评论
微微风
昵称

最新资讯

更多

比特币共识大会本月14日在美国纽约举行

1

最新eos货币价格动态

2

比特币扩容成掣肘未来交易量因素

3

谨防数字货币ico风险,ICO被定义非法集资

4

华强北矿机市场,实地探访深圳华强北矿机市场

5

新发行的数字货币有什么风险?央行提示风险

6

比特币“矿工”南漂记录:东南亚也不景气

7

一枚比特币成本价为8000美元,挖矿已无利可图了吗?

8

去中心化数字货币的风险,分析当前去中心化的数字货币

9

数字货币洗钱实例,一个利用比特币洗钱的案例判决

10

热门点击

更多
1全球欺诈性的数字货币累计涉案金额达到了10亿美元!
2黄金的货币资产王者地位比特币难撼动!
3比特币价格5月初已累计跌超15%!
4惊悚!比特币挖矿或许能让我们三年后无电可用?
5给你指一条区块链投资赚钱的正确的方向!
6区块链与共享单车风口和机遇并存!
7体育+区块链:票务和博彩成为一座金矿!
8迅雷的区块链生态圈初成型!
9fto未来币的基本信息情况介绍!
10fto未来币今日价格是多少?