精华内容
下载资源
问答
  • Java模拟微信红包
    2022-01-16 10:33:34
    import java.util.Scanner;
    import java.util.Random;
    
    public class RedBags{
        public static void main(String[] args) {
            System.out.println("********微信抢红包***********");
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入红包总金额");
            double total = sc.nextDouble();
            System.out.println("请输入红包个数");
            int bagsum = sc.nextInt();
            double min = 0.01;
            Random random = new Random();
            if(total / bagsum == 0.01)
            {
                for (int i = 0; i < bagsum; i++) {
                    double money = min;
                    total -= money;
                    System.out.println("第"+i+"个红包:"+String.format("%.2f",money)+"元");
                }
            }
            else if(total/bagsum<0.01)
            {
                System.out.println("每个人1分钱哦");
                return;
            }
            else
            {
                for (int i = 0; i < bagsum; i++) {
                    double max = total - (bagsum - i)*min;
                    double bound = max - min;
                    double safe = (double) random.nextInt((int)(bound*100))/100;
                    double money = safe + min;
                    total = total - money;
                    System.out.println("第"+i+"个红包:"+String.format("%.2f",money)+"元");
    
                }
            }
            System.out.println("第"+bagsum+"个红包:"+String.format("%.2f",total)+"元");
            sc.close();
    
        }
    }
    更多相关内容
  • 微信红包的小demo,下载就可以复制粘贴,使用的红包类应用
  • 本篇文章介绍了Java微信支付-微信红包,可以实现微信公众号发红包功能,具有一定的参考价值,有需要的可以了解一下。
  • 参数3 :商户订单号 mch_billnoString mch_billno = mch_id + GenerateSequenceUtil....些一个GenerateSequenceUtil类,写一个generateSequenceNo方法import java.text.DecimalFormat;import java.text.FieldPosit...

    QQ%E5%9B%BE%E7%89%8720150910153338.png

    参数3 : 商户订单号  mch_billno

    String mch_billno = mch_id + GenerateSequenceUtil.generateSequenceNo();

    些一个GenerateSequenceUtil类,写一个generateSequenceNo方法

    import java.text.DecimalFormat;

    import java.text.FieldPosition;

    import java.text.Format;

    import java.text.NumberFormat;

    import java.text.SimpleDateFormat;

    import java.util.Calendar;

    import org.apache.log4j.Logger;

    public class GenerateSequenceUtil {

    /** .log */

    private static final Logger logger = Logger.getLogger(GenerateSequenceUtil.class);

    /** The FieldPosition. */

    private static final FieldPosition HELPER_POSITION = new FieldPosition(0);

    /** This Format for format the data to special format. */

    private final static Format dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

    /** This Format for format the number to special format. */

    private final static NumberFormat numberFormat = new DecimalFormat("0000");

    /** This int is the sequence number ,the default value is 0. */

    private static int seq = 0;

    private static final int MAX = 9999;

    /**

    * 时间格式生成序列

    * @return String

    */

    public static synchronized String generateSequenceNo() {

    Calendar rightNow = Calendar.getInstance();

    StringBuffer sb = new StringBuffer();

    dateFormat.format(rightNow.getTime(), sb, HELPER_POSITION);

    numberFormat.format(seq, sb, HELPER_POSITION);

    if (seq == MAX) {

    seq = 0;

    } else {

    seq++;

    }

    logger.info("THE SQUENCE IS :" + sb.toString());

    return sb.toString();

    }

    参数4: 公众账号appid   wxappid

    这个参数可以在微信开发者中心里面看到

    //微信分配的公众账号ID

    String wxappid = "wx8888888888888888";

    参数5 : 商户名称   send_name

    随便写

    String send_name = "测试者";

    参数6 : 用户openid   re_openid

    微信号和公众号对应的唯一的加密过的字符串

    String re_openid = "xxxxxxxxxxxxxxxxxxxxxxx";

    参数7: 付款金额   total_amount

    int total_amount = 100;    单位分

    参数8 : 红包发放总人数  total_num

    int total_num = 1;

    参数9 : 红包祝福语   wishing

    随便写

    String wishing = "测试";

    参数10 : Ip地址   client_ip

    String client_ip = InetAddress.getLocalHost().getHostAddress().toString();

    这里可能报异常,需要抓取一下

    参数11 : 活动名称   act_name

    随便写

    String act_name = "测试创建20150906";

    参数12 : 备注  remark

    随便写

    String remark = "测试";

    最后一个参数sign

    //签名

    Map map = new HashMap();

    map.put("nonce_str", nonce_str);

    map.put("mch_billno", mch_billno);

    map.put("mch_id", mch_id);

    map.put("wxappid", wxappid);

    map.put("send_name", send_name);

    map.put("re_openid", re_openid);

    map.put("total_amount", total_amount);

    map.put("total_num", total_num);

    map.put("wishing", wishing);

    map.put("client_ip", client_ip);

    map.put("act_name", act_name);

    map.put("remark", remark);

    String sign = Signature.getSign(map);

    写一个Signature类,代码如下:

    import org.xml.sax.SAXException;

    import com.yxht.core.common.tools.LoadProperties;

    import javax.xml.parsers.ParserConfigurationException;

    import java.io.IOException;

    import java.lang.reflect.Field;

    import java.util.ArrayList;

    import java.util.Arrays;

    import java.util.Map;

    /**

    * User: rizenguo

    * Date: 2014/10/29

    * Time: 15:23

    */

    public class Signature {

    /**

    * 签名算法

    * @param o 要参与签名的数据对象

    * @return 签名

    * @throws IllegalAccessException

    */

    public static String getSign(Object o) throws IllegalAccessException {

    ArrayList list = new ArrayList();

    Class cls = o.getClass();

    Field[] fields = cls.getDeclaredFields();

    for (Field f : fields) {

    f.setAccessible(true);

    if (f.get(o) != null && f.get(o) != "") {

    list.add(f.getName() + "=" + f.get(o) + "&");

    }

    }

    int size = list.size();

    String [] arrayToSort = list.toArray(new String[size]);

    Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);

    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < size; i ++) {

    sb.append(arrayToSort[i]);

    }

    String result = sb.toString();

    result += "key=" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";   //这里是开发者中心里面服务器配置里面的消息加解密密钥

    Util.log("Sign Before MD5:" + result);

    result = MD5.MD5Encode(result).toUpperCase();

    Util.log("Sign Result:" + result);

    return result;

    }

    public static String getSign(Map map){

    ArrayList list = new ArrayList();

    for(Map.Entry entry:map.entrySet()){

    if(entry.getValue()!=""){

    list.add(entry.getKey() + "=" + entry.getValue() + "&");

    }

    }

    int size = list.size();

    String [] arrayToSort = list.toArray(new String[size]);

    Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);

    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < size; i ++) {

    sb.append(arrayToSort[i]);

    }

    String result = sb.toString();

    result += "key=" + LoadProperties.getSystemdefaultValue("APP_KEY");

    result = MD5.MD5Encode(result).toUpperCase();

    return result;

    }

    /**

    * 从API返回的XML数据里面重新计算一次签名

    * @param responseString API返回的XML数据

    * @return 新鲜出炉的签名

    * @throws ParserConfigurationException

    * @throws IOException

    * @throws SAXException

    */

    public static String getSignFromResponseString(String responseString) throws IOException, SAXException, ParserConfigurationException {

    Map map = XMLParser.getMapFromXML(responseString);

    //清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名

    map.put("sign","");

    //将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较

    return Signature.getSign(map);

    }

    /**

    * 检验API返回的数据里面的签名是否合法,避免数据在传输的过程中被第三方篡改

    * @param responseString API返回的XML数据字符串

    * @return API签名是否合法

    * @throws ParserConfigurationException

    * @throws IOException

    * @throws SAXException

    */

    public static boolean checkIsSignValidFromResponseString(String responseString) throws ParserConfigurationException, IOException, SAXException {

    Map map = XMLParser.getMapFromXML(responseString);

    Util.log(map.toString());

    String signFromAPIResponse = map.get("sign").toString();

    if(signFromAPIResponse=="" || signFromAPIResponse == null){

    Util.log("API返回的数据签名数据不存在,有可能被第三方篡改!!!");

    return false;

    }

    Util.log("服务器回包里面的签名是:" + signFromAPIResponse);

    //清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名

    map.put("sign","");

    //将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较

    String signForAPIResponse = Signature.getSign(map);

    if(!signForAPIResponse.equals(signFromAPIResponse)){

    //签名验不过,表示这个API返回的数据有可能已经被篡改了

    Util.log("API返回的数据签名验证不通过,有可能被第三方篡改!!!");

    return false;

    }

    Util.log("恭喜,API返回的数据签名验证通过!!!");

    return true;

    }

    }

    先讲到这里,所有参数都准备好了,下一步是组成xml

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

    展开全文
  • 主要为大家详细介绍了java微信公众号支付开发之现金红包,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 微信红包开发java,groovy)

    热门讨论 2015-07-01 14:42:23
    根据微信提供的接口,开发微信红包的功能,搞了两天才弄出来,要5分不过吧,细节挺多的,我写了一个文档,记录的很全,所以的代码都有了,使用groovy写的跟java是一样的,建议先看官方开发者文档再进行开发,会...
  • Java微信红包实现

    千次阅读 2021-03-18 13:54:23
    Java微信红包实现  * 功能点探索 * 新建红包:在DB、cache各新增一条记录 * 抢红包:请求访问cache,剩余红包个数大于0则可拆开红包 * key:1,value:20 string decr原子减,每次减1 , 而decreby减指定数量N * ...

    如果上司给一个任务,让我们在实现微信抢红包这个功能,我们该怎么做?
    在这里插入图片描述
      * 业务思考,实现方式千百种,不追求方法复制,只追求推导过程的思考总结

    Java微信抢红包实现
      * 功能点探索

    * 新建红包:在DB、cache各新增一条记录

    * 抢红包:请求访问cache,剩余红包个数大于0则可拆开红包

    * key:1,value:20 string decr原子减,每次减1 , 而decreby减指定数量N

    * 拆红包: 20个红包里面有500块,key:1,value:50000(以分为单位) decreby 548,decreby 1055 ,decreby 2329

    * 请求访问cache,剩余红包个数大于0则继续,同时获取可抢红包数与金额
        * 计算金额(从1分到剩余平均值2倍之间随机数,如果不是最后一个红包,剩余金额预留最少1分给cas更新失败,最后一位拿红包的人)
        * cas更新数据库(更新红包计数表记录【剩余红包个数、剩余红包金额】、插入领取记录)

    * 查看红包记录:用户进来直接查DB即可
    在这里插入图片描述

    Java微信抢红包实现

    1微信红包数据库表设计

    红包流水表

    CREATE TABLE `red_packet_info` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `red_packet_id` bigint(11) NOT NULL DEFAULT 0 COMMENT '红包id,采用timestamp+5位随机数', 
    `total_amount` int(11) NOT NULL DEFAULT 0 COMMENT '红包总金额,单位分',
    `total_packet` int(11) NOT NULL DEFAULT 0 COMMENT '红包总个数',
    `remaining_amount` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包金额,单位分',
    `remaining_packet` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包个数',
    `uid` int(20) NOT NULL DEFAULT 0 COMMENT '新建红包用户的用户标识',
    `create_time` timestamp COMMENT '创建时间',
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 
    PRIMARY KEY (`id`) ) 
    ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='红包信息表,新建一个红包插入一条记录';
    
    • 红包记录表
    CREATE TABLE `red_packet_record` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `amount` int(11) NOT NULL DEFAULT '0' COMMENT '抢到红包的金额',
    `nick_name` varchar(32) NOT NULL DEFAULT '0' COMMENT '抢到红包的用户的用户名',
    `img_url` varchar(255) NOT NULL DEFAULT '0' COMMENT '抢到红包的用户的头像',
    `uid` int(20) NOT NULL DEFAULT '0' COMMENT '抢到红包用户的用户标识',
    `red_packet_id` bigint(11) NOT NULL DEFAULT '0' COMMENT '红包id,采用timestamp+5位随机数', 
    `create_time` timestamp COMMENT '创建时间',
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 
    PRIMARY KEY (`id`) ) 
    ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='抢红包记录表,抢一个红包插入一条记录';
    
    • 将库表导入数据库

    • 通过mybatis generator生成代码

    2发红包接口实现

    发红包功能接口开发

    * 新增一条红包记录
      * 往mysql里面添加一条红包记录
      * 往redis里面添加一条红包数量记录 decr
      * 往redis里面添加一条红包金额记录 decreby

    • 抢红包功能接口开发

    * 抢红包功能属于原子减操作
      * 当大小小于0时原子减失败

    • 当红包个数为0时后面进来的用户全部抢红包失败,并不会进入拆红包环节

    • 抢红包功能扩展设计

    * 将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回
      * 类推出token令牌和秒杀设计原理

    • 注意点

    * 抢到红包不到能拆成功

    * 2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。

    2015年后的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。
       在这里插入图片描述

    3 抢红包接口实现

    抢红包功能接口开发

    * 在抢红包这里并不能保证用户已经能领到这个红包

    - 抢红包只是做了一个判断,判断当前是否还有红包
      - 有红包则返回可以领
      - 没红包则返回不可以领

    • 拆红包功能接口开发

    * 拆红包才是用户能领到红包
      * 这时候要先减redis里面的金额和红包数量
      * 减完金额再入库
    在这里插入图片描述

    4微信红包设计算法分析

    玩法:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储

    • 分配:
        * 发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动
        * 当前面4个红包总共被领了30块钱时,剩下70块钱,总共6个红包,那么这7个红包的额度在:0.01~(70➗6✖️2)=23.33之间波动(红包金额/个数*2)
        * 这样算下去,可能会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可
        - 存储:数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作
        - 转账:通过财付通往红包所得者账户转账,过程通过是异步操作

    抢红包项目总结

    • take all操作

    - 入库转账时需要保证红包个数和红包剩余金额正确

    • 高并发处理:红包如何计算被抢完?
        - cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光
    • 性能扩展
        * 多主sharding,水平扩展机器
        * 数据库层面sharding分片
        * redis层面sharding分片技术
    • 业务能动性,从发展的角度来看待业务
    • 观察总结,技术赋能业务

    我是Java工程师,如果你现在也在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中有遇见任何关于学习方法,学习路线等方面的问题,都可以申请加入我的Java学习交流群:3907814,里面聚集了很多正在自学Java的初学者,文件里面还有我做Java技术这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书记教程,需要的话都可以自行来浏览获取。

    展开全文
  • JAVA微信现金红包开发教程

    千次阅读 热门讨论 2018-05-07 14:08:35
    1.首先做微信方面的开发,一定需要详细的阅读微信支付的开发...https://pay.weixin.qq.com/wiki/doc/api/index.html2.在开发微信红包之前,你首先肯定得准备好微信商户平台,微信公众号(服务号)(在这里假设你已经...

    1.首先做微信方面的开发,一定需要详细的阅读微信支付的开发文档。因为里面列举了比如消息的触达规则,接口调用的请求说明,请求的参数,错误返回示例以及成功返回示例,阅读这些,在出错了我们能够快速定位并且解决问题。

    https://pay.weixin.qq.com/wiki/doc/api/index.html


    2.在开发微信红包之前,你首先肯定得准备好微信商户平台,微信公众号(服务号)(在这里假设你已经全部准备好了)。

    3.我这个发送红包是大转盘抽奖,抽到了红包奖品之后,通知后台去发送红包。废话不多说,前端ajax代码:

    //前端发送ajax请求,请求后台去发送红包,前后端交互采用的是json格式的数据进行传输。
    var redPacketRequestJson = {
           "appid":$("#appid").val(),//该公众号的appid的值
           "openid":$("#openid").val(),//该用户的openid的值
           "redValue":$("#redValue").val()//红包的大小值,单位为分,最低为100分也就是一元
         };
    $.ajax({
       type: "post",
       url: "http://localhost/wechat/sendRedPacket",
       contentType: "application/json; charset=utf-8",
       data: JSON.stringify(redPacketRequestJson),
       dataType: "json",
       success: function (data) {
       if(data.statusCode==100){
            console.log("红包发送成功")
        }
        },
       error: function (XMLHttpRequest, textStatus, errorThrown) {
              alert(XMLHttpRequest.status);
              alert(XMLHttpRequest.readyState);
              alert(textStatus);
             }
      });

    后台的代码如下:

        @ResponseBody
        @RequestMapping("/sendRedPacket")
        public String sendRedPacket(@RequestBody(required = false) String requestJson, HttpServletRequest request){
            try{
                logger.info("发送红包的时候,前端传输过来的信息是:"+requestJson);
                JSONObject jsonObject = JSONObject.parseObject(requestJson);
                //公众号的appid
                String appid = jsonObject.getString("appid");
                /**
                 * 根据APPID获取access_token
                 * 我的access_token是做了一个定时器,每隔两个小时刷新一次access_token的值,
                 * 并且保存在redis当中(需要详情的话请留言)。
                 */
                String access_token = RedisUtil.getJustOneMapValueFromRedis(jedisPool,appid,"access_token");
                //发给谁,该用户的openid
                String openid = jsonObject.getString("openid");
                //红包的值,最低100分
                Integer redValue = jsonObject.getInteger("redValue");
                //开始发送红包
                logger.info("++++++++++++++开始发送红包++++++++++++++++++");
                SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
                /** 当前时间 yyyyMMddHHmmss */
                String currTime = CommonUtil.getCurrTime();
                /** 8位日期 */
                String strTime = currTime.substring(8, currTime.length());
                /** 四位随机数 */
                String strRandom = CommonUtil.buildRandom(4) + "";
                //商户订单号
                parameters.put("mch_billno",strTime + strRandom);
                /** 商户号 */
                String mch_id = Constants.mch_id;
                parameters.put("mch_id", mch_id);
                /** 随机字符串 */
                parameters.put("nonce_str", CommonUtil.getNonceStr());
                /** 公众号APPID */
                parameters.put("wxappid", appid);
                /** 商户名称 */
                String mch_name = "这个填你们申请微信支付的公众号的名称";
                parameters.put("send_name",mch_name);
                /** 用户openid */
                parameters.put("re_openid",openid);
                /** 付款金额 */
                parameters.put("total_amount",redValue);
                /** 红包发放总人数 */
                parameters.put("total_num",1);
                /** 红包祝福语 */
                parameters.put("wishing","感谢您参加抽奖活动,希望您再次中奖");
                /** 调用接口的机器Ip地址 */
                parameters.put("client_ip",request.getRemoteAddr());
                /** 活动名称 */
                String activityName = "这个填你们这个红包活动的名称";
                parameters.put("act_name",activityName);
                /** 备注 */
                parameters.put("remark","抽的多中的多,欢迎下次再来");
                /** 场景id  发放红包使用场景,红包金额大于200时必传
                 * PRODUCT_1:商品促销 PRODUCT_2:抽奖 PRODUCT_4:企业内部福利  PRODUCT_5:渠道分润 */
                parameters.put("scene_id","PRODUCT_2");
                /** 资金授权商户号 */
                //parameters.put("consume_mch_id","");
                /** 活动信息  资金授权商户号,服务商替特约商户发放时使用*/
                //parameters.put("risk_info","");
                /** MD5进行签名,必须为UTF-8编码,注意上面几个参数名称的大小写 */
                String api_key = "这个填你们商户平台的支付密钥的信息";
                String sign = CommonUtil.createSign("UTF-8", parameters,api_key);
                String requestJsonStr = JSON.toJSONString(parameters);
                logger.info("发送的信息是"+requestJsonStr);
                parameters.put("sign", sign);//
                /** 生成xml结构的数据,用于统一下单接口的请求 */
                String requestXML = CommonUtil.getRequestXml(parameters);
                /**
                 * 读取证书
                 * 
                 */
                CloseableHttpClient httpclient = null;
                Map<String,String> result = new HashMap<String,String>();
                try {
                    KeyStore keyStore = KeyStore.getInstance("PKCS12");
                    String pathname = "/usr/apiclient_cert.p12";//这里填你们的证书的地址,我这里放在linux服务器的/usr下面
                    FileInputStream instream = new FileInputStream(new File(pathname)); //此处为证书所放的绝对路径
                    try {
                        keyStore.load(instream, mch_id.toCharArray());
                    } finally {
                        instream.close();
                    }
                    // Trust own CA and all self-signed certs
                    SSLContext sslcontext = SSLContexts.custom()
                            .loadKeyMaterial(keyStore, mch_id.toCharArray())
                            .build();
                    // Allow TLSv1 protocol only
                    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                            sslcontext,
                            new String[]{"TLSv1"},
                            null,
                            SSLConnectionSocketFactory.getDefaultHostnameVerifier());//SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
                    httpclient = HttpClients.custom()
                            .setSSLSocketFactory(sslsf)
                            .build();
                }
                catch (Exception e){
                    logger.info("读取证书信息的时候发生异常异常信息是:"+e.getMessage());
                    e.printStackTrace();
                }
                try {
                    String requestUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
                    HttpPost httpPost = new HttpPost(requestUrl);
                    StringEntity reqEntity  = new StringEntity(requestXML, "utf-8");
                    // 设置类型
                    reqEntity.setContentType("application/x-www-form-urlencoded");
                    httpPost.setEntity(reqEntity);
                    logger.info("executing request" + httpPost.getRequestLine());
                    CloseableHttpResponse response = httpclient.execute(httpPost);
                    try {
                        HttpEntity entity = response.getEntity();
                        System.out.println(response.getStatusLine());
                        if (entity != null) {
                            // 从request中取得输入流
                            InputStream inputStream = entity.getContent();
                            // 读取输入流
                            SAXReader reader = new SAXReader();
                            Document document = reader.read(inputStream);
                            // 得到xml根元素
                            Element root = document.getRootElement();
                            // 得到根元素的所有子节点
                            List<Element> elementList = root.elements();
                            // 遍历所有子节点
                            for (Element e : elementList)
                            {
                                result.put(e.getName(), e.getText());
                            }
                            // 释放资源
                            inputStream.close();
                        }
                        EntityUtils.consume(entity);
                    }
                    finally {
                        if(response!=null) {
                            response.close();
                        }
                    }
                }
                catch (Exception e){
                    e.printStackTrace();
                }finally {
                    try {
                        httpclient.close();
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                }
                logger.info("------------------发送红包结束---------------");
                logger.info("发送红包微信返回的信息是:"+JSON.toJSONString(result));
                //假如发送成功的话,保存发送的信息
                if(result.get("return_msg").equals("发放成功")) {
                    logger.info("红包发放成功openid="+openid+",发送时间是:"+CommonUtil.getPreDay(new Date(),0));
                    return ApiResponse.buildSuccessResponse(ResultConstant.OPERATOR_SUCCESS,ResultConstant.MESSAGE_OPERATE_SUCCESS,result);
                    }
                else {
                    logger.info("红包发放失败,openid="+openid+",发送时间是:"+CommonUtil.getPreDay(new Date(),0));
                    return ApiResponse.buildFailResponse(ResultConstant.OPERATOR_FAIL,ResultConstant.MESSAGE_OPERATE_FAIL);
                }
            }
            catch (Exception e){
                logger.info("发送红包异常,异常信息是:"+e.getMessage());
                return ApiResponse.buildFailResponse(ResultConstant.OPERATOR_FAIL,ResultConstant.MESSAGE_SYSTEM_EXCEPTION);
            }
        }

    其中,由于学习微信开发的时候看的参考书籍是柳峰老师的微信开发教程,所以工具类的名称是一样的,在这里把这里需要的一些方法罗列在下面(代码中需要的从上往下排列,在开发微信的其他模块也可能用的上的):

     /**
         * 获取当前时间 yyyyMMddHHmmss
         * @return String
         */
        public static String getCurrTime() {
            Date now = new Date();
            SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
            String s = outFormat.format(now);
            return s;
        }
    /**
         * 取出一个指定长度大小的随机正整数.
         *
         * @param length int 设定所取出随机数的长度。length小于11
         * @return int 返回生成的随机数。
         */
        public static int buildRandom(int length) {
            int num = 1;
            double random = Math.random();
            if (random < 0.1) {
                random = random + 0.1;
            }
            for (int i = 0; i < length; i++) {
                num = num * 10;
            }
            return (int) ((random * num));
        }
    /**
         * 获取32位随机字符串
         *
         * @return
         */
        public static String getNonceStr() {
            Random random = new Random();
            return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "UTF-8");
        }
    /**
         * 微信支付sign签名
         * @param characterEncoding
         * @param parameters
         * @return
         */
        public static String createSign(String characterEncoding, SortedMap<Object, Object> parameters,String api_key) {
            StringBuffer sb = new StringBuffer();
            Set<Map.Entry<Object, Object>> es = parameters.entrySet();
            Iterator<Map.Entry<Object, Object>> it = es.iterator();
            while (it.hasNext()) {
                Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) it.next();
                String k = (String) entry.getKey();
                Object v = entry.getValue();
                /** 如果参数为key或者sign,则不参与加密签名 */
                if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
                    sb.append(k + "=" + v + "&");
                }
            }
            System.out.println("传过来的支付密钥api_key="+api_key);
            /** 支付密钥必须参与加密,放在字符串最后面 */
            sb.append("key=" + api_key);
            /** 记得最后一定要转换为大写 */
            String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
            return sign;
        }
    /**
         * 将请求参数转换为xml格式的string
         * @param parameters
         * @return
         */
        public static String getRequestXml(SortedMap<Object, Object> parameters) {
            StringBuffer sb = new StringBuffer();
            sb.append("<xml>");
            Set<Map.Entry<Object, Object>> es = parameters.entrySet();
            Iterator<Map.Entry<Object, Object>> it = es.iterator();
            while (it.hasNext()) {
                Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) it.next();
                String k = (String) entry.getKey();
                String v = entry.getValue() + "";
                if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
                    sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
                } else {
                    sb.append("<" + k + ">" + v + "</" + k + ">");
                }
            }
            sb.append("</xml>");
            return sb.toString();
        }
     /**
         * 获取系统前一天的信息(amount=-1),当前时间(amount=0),后一天(amount=1)
         * @param date
         * @return
         */
        public static String getPreDay(Date date,Integer amount) {
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.DAY_OF_MONTH, amount);
            date = calendar.getTime();
            String value = sdf.format(date);
            return value.split(" ")[0];
        }

    其中一些需要注意的,比如api_key(即下图当中的API密钥),商户支付证书(下图中的下载证书)在你们的商户平台去设置和下载。


    去产品中心-我的产品看下你的现金红包是否已经开通了,假如未开通有未开通的提示信息,然后去开通就行了。


    点击这个现金红包,可以给现金红包进行一些设置,比如只允许某个IP调用现金红包API(感觉这个很重要)。


    以上这些都弄好了,设置好了,去给自己发个红包吧!!!







    展开全文
  • java 实现仿照微信红包算法
  • 农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守。昨日,微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金... 春节期间,微信红包以其独特的魅力
  • 微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包。通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果。具体能力如下:商户...
  • Java实现微信红包

    2021-03-01 07:43:28
    之前的所有内容中,综合Java这方面的知识,可以模拟发普通红包。那么这篇博客,我将整合之前介绍的所有的技术和知识,编写一个带界面版的 发红包 案例。需求分析分析并使用已给出的类,编写程序,设置红包类型。小...
  • 这几天看了下以前写的有关微信支付的博客,看的人仍是挺多的,看了下留言不知道是由于博客写的不够细仍是什么状况,大多都找我要源码...php下面是微信开发文档对现金红包的介绍:java现金红包,是微信支付商户平台提...
  • //import相关类importjava.io.FileInputStream;importjava.security.KeyStore;importjava.util.Date;importjava.util.List;importjava.util.Map;importjavax.net.ssl.KeyManagerFactory;importjavax.net.ssl.SSL...
  • Java微信开发之现金红包接口

    万次阅读 2016-01-13 10:28:47
    1、接口文档https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_52、证书下载及证书安装首先,商户调用微信红包接口时,服务器会进行证书验证,所以要在商户平台下载证书。在管理后台的“账户信息...
  • java微信红包实现

    千次阅读 2019-01-18 19:55:28
    使用redis实现红包功能红包实现第一种方式 (redis队列)功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • 当请求结束后,会受到微信服务器返回给我们的结果处理第三节中的reback//将接收到的返回信息Map mso = new HashMap();mso = XMLParser.getMapFromXML(reback);需要抓取异常写一个XMLParser类import org.w3c.dom....
  • 本文主要介绍Java微信公众号、微信小程序、微信网页 支付和提现相关的开发流程,同时附带源码和注释,方便读者学习。
  • 微信小程序开发.xmind

    2021-06-24 15:57:10
    微信小程序开发
  • import java.util.Random; import java.util.Scanner; public class HongBao { ... System.out.println("=======微信红包====="); //引入控制台进行 Scanner scanner = new Scanner(System.in); System.out.p
  • java源码微信红包牛牛 Android最全开发资源 首先, 我觉得最好的Android学习路径还是: 看 (在国内的朋友可以上), 要记住Read The "Friendly" (F***ing) Doc (阅读那该死的文档) , 和看Google Android官方视频教程。 ...
  • 性能优化点:1.使用int不使用double。(单位用分不用元)也省去了还要用math.round四舍五入,把double类型数据只留小数点后前两位。2.random() 方法用于返回一个随机数,随机数范围为 0.0 =<...import java.util.H...
  • Java开发微信红包系统-腾讯移动互联网最新技术.rar
  • 下面我们介绍下两种算法的实现:二倍均值法原理剩余红包金额M,剩余人数N,那么:每次抢到金额=随机(0,M/N*2)保证了每次随机金额的平均值是公平的假设10人,红包金额100元第一人:100/10*2=20,随机范围(0,20),...
  • 本文实例为大家分享了微信小程序实现发红包的具体代码,供大家参考,具体内容如下 目前此功能尚在内测,无法申请。此博文仅示例。 流程效果图: 图片1触发wx.sendBizRedPacket({})吊起图片2,点击开,出现图片3,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,002
精华内容 1,600
关键字:

java微信红包开发

java 订阅