微信开发给用户发红包_微信公众号发红包开发 - CSDN
  • 微信公众号发红包开发教程

    千次阅读 2018-07-31 12:01:32
    发红包 demo 下载 一、开通现金红包权限 在使用现金红包之前,请前往开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包——>开通】。 二、下载API证书 商户...

    使用微信现金红包的3个流程

    1. 申请现金红包功能
    2. 添加微信现金红包模板
    3. 发放现金红包

    开发演示demo

    1. 发红包 demo 下载

    一、开通现金红包权限

    在使用现金红包之前,请前往开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包——>开通】。

    二、下载API证书

    商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书

    现金红包-下载证书.png

    现金红包-下载之后的文件.png

    有人要问这么多证书到底使用那个呢?跟开发语言有关系吗?

    什么语言使用什么证书,以及如何使用可以参考截图中的证书说明.txt

    内容如下:

    欢迎使用微信支付!
    微信支付API共四份(证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书),为接口中强制要求时需携带的证书文件。
    证书属于敏感信息,请妥善保管不要泄露和被他人复制。
    不同开发语言下的证书格式不同,以下为说明指引:
        证书pkcs12格式(apiclient_cert.p12)
            包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
            部分安全性要求较高的API需要使用该证书来确认您的调用身份
            windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:10010000)
        证书pem格式(apiclient_cert.pem)
            从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
            部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
            您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
        证书密钥pem格式(apiclient_key.pem)
            从apiclient_cert.p12中导出密钥部分的文件,为pem格式
            部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
            您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
        CA证书(rootca.pem)
            微信支付api服务器上也部署了证明微信支付身份的服务器证书,您在使用api进行调用时也需要验证所调用服务器及域名的真实性
            该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性
            某些环境和工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用
    
    

    三、充值

    在发放现金红包之前,请确保你的资金充足。如若不足,请充值。操作路径:【登录商户平台——>账户中心——>资金管理——>充值】

    每个红包的平均金额必须在1.00元到200.00元之间

    现金红包-充值.png

    四、获取openid

    目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见之前写的文章:极速开发微信公众号之授权获取用户信息

    五、相关参数设置

    和红包相关的参数【主要是安全方面:绑定IP、防止用户盗刷】,你可以在页面上自主设置和更改。
    操作路径如下:【登录商户平台——>产品中心——>现金红包——>产品设置】(注:“产品设置”操作按钮仅当你开通现金红包功能之后才会出现)。
    你可以设置和更改以下参数:

    现金红包-设置参数.png

    说明:
    1、 调用IP地址:设置之后,仅有已设置的IP地址可以调用,其余的IP调用会报错;
    2、用户领取上限:限制同一openid同一日领取的个数
    3、防刷等级:防刷是指微信风控针对微信小号、僵尸号、机器号等的拦截,你可以通过更改防刷等级控制防刷的强度。
    4、 同时,你也可以申请更改红包额度。但是需要经过微信支付的审核,审核通过之后才会生效。

     

    展开全文
  • 微信公众平台开发之现金红包(Java)

    万次阅读 热门讨论 2015-02-25 19:18:57
    微信公众平台,微信现金红包,现金红包,java

    本文介绍的是基于Java语言开发微信现金红包的例子。由于个人表达能力和编程能力有限,请多多包涵。本文仅介绍拥有微信支付权限的微信公众号开发。

    本文分为以下两部分:

    1.开发现金红包SDK

    2.构造现金红包并发送

    首先看一下现金红包接口文档:http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_1


    首页
    现金红包

    功能介绍

    春节期间,微信红包以其独特的魅力,优秀的用户体验和安全的支付环境,一经推出即受到了广大用户的热烈欢迎,现微信支付现金红包向微信支付商户开发,具体能力如下: 

    1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景

    2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验


    微信红包发送规则

    1. 发送频率规则

     ◆ 每分钟发送红包数量不得超过1800个;

     ◆ 北京时间0:00-8:00不触发红包赠送;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)

    2. 红包规则

     ◆ 单个红包金额介于[1.00元,200.00元]之间;

     ◆ 同一个红包只能发送给一个用户;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)


    商户侧调用红包接口流程

    1. 登录微信支付商户平台下载证书以及充值

    在调用接口前,请商户使用微信支付商户号登录微信支付商户平台完成下述工作:

    备注:

    微信支付商户平台地址为pay.weixin.qq.com。微信支付商户号会在商户申请微信支付成功后,通过开户邮件发送给您。请不要使用微信公众平台账号或者appid登录。如果您登录时遇到问题,请联系微信支付小助手weixinpay@tencent.com

     ◆ 下载证书

    商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书

     

     ◆ 充值

     发放现金红包将扣除商户的可用余额,请注意,可用余额并不是微信支付交易额,需要预先充值,确保可用余额充足。查看可用余额、充值、提现请登录微信支付商户平台,进入“资金管理”菜单,进行操作

     

    2. 微信红包接口调用流程

     ◆ 后台API调用:待进入联调过程时与开发进行详细沟通;

     ◆ 告知服务器:告知服务器接收微信红包的用户openID,告知服务器该用户获得的金额;

     ◆ 从商务号扣款:服务器获取信息后从对应的商务号扣取对应的金额;

     ◆ 调用失败:因不符合发送规则,商务号余额不足等原因造成调用失败,反馈至调用方;

     ◆ 发送成功:以微信红包公众账号发送对应红包至对应用户;

     


    用户交互流程

    调用现金红包接口,发放成功后,用户领取红包流程如下:

    步骤(一):收到领取红包消息,根据用户微信版本不同,分为:

    • 微信版本在6.1及以上的用户收到企业自身微信号(调用接口时传入appid对应的商户号)下发领取消息;如果用户未关注微信号,那么会收到由“服务通知”下发的消息
      

     

    • 微信版本在6.1以下的用户仍按原流程收取消息:由微信红包公众号下发领取消息

     

     

    步骤(二):点击领取消息,拆红包

     

     <img src="http://pay.weixin.qq.com/wiki/doc/api/img/chapter13_5.png" "width="261" height="464" style="border: 0px none; vertical-align: top;">
    1. 接口列表

    业务

    接口

    简介

    现金红包

    发放红包

    用于企业向微信用户个人发现金红包

    目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档:  网页授权获取用户基本信息


    接口详细说明

    1.红包发放说明

    用于企业向微信用户个人发现金红包

    目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档: 网页授权获取用户基本信息

    接口参数与用户领用实际效果对应关系如下:

    如需操作请登录https://pay.weixin.qq.com/

     

     

     

    2.接口调用请求说明

    请求Url

    https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack

    是否需要证书

    是(证书及使用说明详见商户证书

    请求方式

    POST

    3.请求参数

    字段名

    字段

    必填

    示例值

    类型

    说明

    随机字符串

    nonce_str

    5K8264ILTKCH16CQ2502SI8ZNMTM67VS

    String(32)

    随机字符串,不长于32位

    签名

    sign

    C380BEC2BFD727A4B6845133519F3AD6

    String(32)

    详见签名生成算法

    商户订单号

    mch_billno

    10000098201411111234567890

    String(28)

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

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

    接口根据商户订单号支持重入, 如出现超时可再调用。

    商户号

    mch_id

    10000098

    String(32)

    微信支付分配的商户号

    子商户号

    sub_mch_id

    10000090

    String(32)

    微信支付分配的子商户号,受理模式下必填

    公众账号appid

    wxappid

    wx8888888888888888

    String(32)

    商户appid

    提供方名称

    nick_name

    天虹百货

    String(32)

    提供方名称

    商户名称

    send_name

    天虹百货

    String(32)

    红包发送者名称

    用户openid

    re_openid

    oxTWIuGaIt6gTKsQRLau2M0yL16E

    String(32)

    接受收红包的用户

    用户在wxappid下的openid

    付款金额

    total_amount

    1000

    int

    付款金额,单位分

    最小红包金额

    min_value

    1000

    int

    最小红包金额,单位分

    最大红包金额

    max_value

    1000

    int

    最大红包金额,单位分

    ( 最小金额等于最大金额: min_value=max_value =total_amount)

    红包发放总人数

    total_num

    1

    int

    红包发放总人数

    total_num=1

    红包祝福语

    wishing

    感谢您参加猜灯谜活动,祝您元宵节快乐!

    String(128)

    红包祝福语

    Ip地址

    client_ip

    192.168.0.1

    String(15)

    调用接口的机器Ip地址

    活动名称

    act_name

    猜灯谜抢红包活动

    String(32)

    活动名称

    备注

    remark

    猜越多得越多,快来抢!

    String(256)

    备注信息

    商户logo的url

    logo_imgurl

    https://wx.gtimg.com/mch/img/ico-logo.png

    String(128)

    商户logo的url

    分享文案

    share_content

    快来参加猜灯谜活动

    String(256)

    分享文案

    分享链接

    share_url

    http://www.qq.com

    String(128)

    分享链接

    分享的图片

    share_imgurl

    https://wx.gtimg.com/mch/img/ico-logo.png

    String(128)

    分享的图片url

    数据示例:

    <xml>

                <sign></sign>

                <mch_billno></mch_billno>

                <mch_id></mch_id>

                <wxappid></wxappid>

                <nick_name></nick_name>

                <send_name></send_name>

                <re_openid></re_openid>

                <total_amount></total_amount>

                <min_value></min_value>

                <max_value></max_value>

                <total_num></total_num>

                <wishing></wishing>

                <client_ip></client_ip>

                <act_name></act_name>

                <act_id></act_id>

                <remark></remark>

                <logo_imgurl></logo_imgurl>

                <share_content></share_content>

                <share_url></share_url>

                <share_imgurl></share_imgurl>

                <nonce_str></nonce_str>

            </xml>

    4.返回参数

    字段名

    变量名

    必填

    示例值

    类型

    说明

    返回状态码

    return_code

    SUCCESS

    String(16)

    SUCCESS/FAIL

    此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断

    返回信息

    return_msg

    签名失败

     

    String(128)

    返回信息,如非空,为错误原因

    签名失败

    参数格式校验错误

    以下字段在return_code为SUCCESS的时候有返回

    签名

    sign

    C380BEC2BFD727A4B6845133519F3AD6

    String(32)

    生成签名方式详见签名生成算法

    业务结果

    result_code

    SUCCESS

    String(16)

    SUCCESS/FAIL

    错误代码

    err_code

    SYSTEMERROR

    String(32)

    错误码信息

    错误代码描述

    err_code_des

    系统错误

    String(128)

    结果信息描述

    以下字段在return_code 和result_code都为SUCCESS的时候有返回

    商户订单号

    mch_billno

    10000098201411111234567890

    String(28)

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

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

    商户号

    mch_id

    10000098

    String(32)

    微信支付分配的商户号

    公众账号appid

    wxappid

    wx8888888888888888

    String(32)

    商户appid

    用户openid

    re_openid

    oxTWIuGaIt6gTKsQRLau2M0yL16E

    String(32)

    接受收红包的用户

    用户在wxappid下的openid

    付款金额

    total_amount

    1000

    int

    付款金额,单位分

    发放成功时间

     

     

     

     

     

    微信单号

     

     

     

     

     

    成功示例:

    <xml>

    <return_code><![CDATA[SUCCESS]]></return_code>

    <return_msg><![CDATA[发放成功.]]></return_msg>

    <result_code><![CDATA[SUCCESS]]></result_code>

    <err_code><![CDATA[0]]></err_code>

    <err_code_des><![CDATA[发放成功.]]></err_code_des>

    <mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>

    <mch_id>10010404</mch_id>

    <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>

    <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

    <total_amount>1</total_amount>

    </xml>

    失败示例:

    <xml>

                     <return_code><![CDATA[FAIL]]></return_code>

    <return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg>

    <result_code><![CDATA[FAIL]]></result_code>

    <err_code><![CDATA[268458547]]></err_code>

    <err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des>

    <mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno>

    <mch_id>10010404</mch_id>

    <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>

    <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

    <total_amount>1</total_amount>

    </xml>

     

     

    5.错误码

    错误代码

    描述

    解决方案

    NOAUTH

    无权限

    请联系微信支付开通api权限

    PARAM_ERROR

    参数错误

    请查看err_code_des,修改设置错误的参数

    OPENID_ERROR

    Openid错误

    根据用户在商家公众账号上的openid,获取用户在红包公众账号上的openid 错误。请核对商户自身公众号appid和用户在此公众号下的openid。

    NOTENOUGH

    余额不足

    商户账号余额不足,请登录微信支付商户平台充值

    SYSTEMERROR

    系统繁忙,请再试。

    可用同一商户单号再次调用,只会发放一个红包。

    TIME _LIMITED

    企业红包的发送时间受限

    请北京时间0:00-8:00时间之外触发红包赠送

    SECOND_OVER_LIMITED

    企业红包的按分钟发放受限

    每分钟发送红包数量不得超过1800个;(可联系微信支付wxhongbao@tencent.com调高额度)

    MONEY_LIMIT

    红包金额发放限制

    每个红包金额必须大于1元,小于200元(可联系微信支付wxhongbao@tencent.com调高额度至4999元)

     

    现金红包API文档:https://pay.weixin.qq.com/helper/cashredopenapi_V2.pdf这个里面是非常详细的,一定要仔细看哦。


    一、开发现金红包SDK

    1.创建一个红包,本文介绍的是创建一个固定金额的红包。
    2.接口调用说明

    请求Url

    https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack

    是否需要证书

    是(证书及使用说明详见商户证书

    请求方式

    POST

    证书是必须的,上面的现金红包接口文档里面有介绍。
    点击这个链接:http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_3
    这一节有介绍的。
    3.请求参数。注意看下,有的参数是必填的。

    二、构造现金红包并发送

    构造现金红包实体类

    public class SendRedPackPo {
    private String nonce_str;
    private String sign;
    private String mch_billno;
    private String mch_id;
    private String sub_mch_id;
    private String wxappid;
    private String nick_name;
    private String send_name;
    private String re_openid;
    private String total_amount;
    private String min_value;
    private String max_value;
    private String total_num;
    private String wishing;
    private String client_ip;
    private String act_name;
    private String remark;
    private String logo_imgurl;
    private String share_content;
    private String share_url;
    private String share_imgurl;

    public String getNonce_str() {
    return nonce_str;
    }
    public void setNonce_str(String nonceStr) {
    nonce_str = nonceStr;
    }
    public String getSign() {
    return sign;
    }
    public void setSign(String sign) {
    this.sign = sign;
    }
    public String getMch_billno() {
    return mch_billno;
    }
    public void setMch_billno(String mchBillno) {
    mch_billno = mchBillno;
    }
    public String getMch_id() {
    return mch_id;
    }
    public void setMch_id(String mchId) {
    mch_id = mchId;
    }
    public String getSub_mch_id() {
    return sub_mch_id;
    }
    public void setSub_mch_id(String subMchId) {
    sub_mch_id = subMchId;
    }
    public String getWxappid() {
    return wxappid;
    }
    public void setWxappid(String wxappid) {
    this.wxappid = wxappid;
    }
    public String getNick_name() {
    return nick_name;
    }
    public void setNick_name(String nickName) {
    nick_name = nickName;
    }
    public String getSend_name() {
    return send_name;
    }
    public void setSend_name(String sendName) {
    send_name = sendName;
    }
    public String getRe_openid() {
    return re_openid;
    }
    public void setRe_openid(String reOpenid) {
    re_openid = reOpenid;
    }
    public String getTotal_amount() {
    return total_amount;
    }
    public void setTotal_amount(String totalAmount) {
    total_amount = totalAmount;
    }
    public String getMin_value() {
    return min_value;
    }
    public void setMin_value(String minValue) {
    min_value = minValue;
    }
    public String getMax_value() {
    return max_value;
    }
    public void setMax_value(String maxValue) {
    max_value = maxValue;
    }
    public String getTotal_num() {
    return total_num;
    }
    public void setTotal_num(String totalNum) {
    total_num = totalNum;
    }
    public String getWishing() {
    return wishing;
    }
    public void setWishing(String wishing) {
    this.wishing = wishing;
    }
    public String getClient_ip() {
    return client_ip;
    }
    public void setClient_ip(String clientIp) {
    client_ip = clientIp;
    }
    public String getAct_name() {
    return act_name;
    }
    public void setAct_name(String actName) {
    act_name = actName;
    }
    public String getRemark() {
    return remark;
    }
    public void setRemark(String remark) {
    this.remark = remark;
    }
    public String getLogo_imgurl() {
    return logo_imgurl;
    }
    public void setLogo_imgurl(String logoImgurl) {
    logo_imgurl = logoImgurl;
    }
    public String getShare_content() {
    return share_content;
    }
    public void setShare_content(String shareContent) {
    share_content = shareContent;
    }
    public String getShare_url() {
    return share_url;
    }
    public void setShare_url(String shareUrl) {
    share_url = shareUrl;
    }
    public String getShare_imgurl() {
    return share_imgurl;
    }
    public void setShare_imgurl(String shareImgurl) {
    share_imgurl = shareImgurl;
    }

    }


    /**
     * 生成32位字符串
     * */
    public class UUIDHexGenerator {


    private String sep = "";


    private static final int IP;


    private static short counter = (short) 0;


    private static final int JVM = (int) (System.currentTimeMillis() >>> 8);


    private static UUIDHexGenerator uuidgen = new UUIDHexGenerator();


    static {
    int ipadd;
    try {
    ipadd = toInt(InetAddress.getLocalHost().getAddress());
    } catch (Exception e) {
    ipadd = 0;
    }
    IP = ipadd;
    }


    public static UUIDHexGenerator getInstance() {
    return uuidgen;
    }


    public static int toInt(byte[] bytes) {
    int result = 0;
    for (int i = 0; i < 4; i++) {
    result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];
    }
    return result;
    }


    protected String format(int intval) {
    String formatted = Integer.toHexString(intval);
    StringBuffer buf = new StringBuffer("00000000");
    buf.replace(8 - formatted.length(), 8, formatted);
    return buf.toString();
    }


    protected String format(short shortval) {
    String formatted = Integer.toHexString(shortval);
    StringBuffer buf = new StringBuffer("0000");
    buf.replace(4 - formatted.length(), 4, formatted);
    return buf.toString();
    }


    protected int getJVM() {
    return JVM;
    }


    protected synchronized short getCount() {
    if (counter < 0) {
    counter = 0;
    }
    return counter++;
    }


    protected int getIP() {
    return IP;
    }


    protected short getHiTime() {
    return (short) (System.currentTimeMillis() >>> 32);
    }


    protected int getLoTime() {
    return (int) System.currentTimeMillis();
    }


    public String generate() {
    return new StringBuffer(36)
    .append(format(getIP()))
    .append(sep)
    .append(format(getJVM()))
    .append(sep)
    .append(format(getHiTime()))
    .append(sep)
    .append(format(getLoTime()))
    .append(sep)
    .append(format(getCount()))
    .toString();
    }


    /**
    * @param args
    */
    public static void main(String[] args) {
    String id;
    UUIDHexGenerator uuid = UUIDHexGenerator.getInstance();
     
    for(int i = 0;i<100;i++)
    {
    id = uuid.generate();
     
    }

    }
    }



    /** 
    * 功能:MD5签名处理核心文件,不需要修改
    * 说明:
    * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
    * */
    public class MD5 {

        /**
         * 签名字符串
         * @param text 需要签名的字符串
         * @param key 密钥
         * @param input_charset 编码格式
         * @return 签名结果
         */
        public static String sign(String text, String key, String input_charset) {
        text = text + key;
            return DigestUtils.md5Hex(getContentBytes(text, input_charset));
        }
        
        /**
         * 签名字符串
         * @param text 需要签名的字符串
         * @param sign 签名结果
         * @param key 密钥
         * @param input_charset 编码格式
         * @return 签名结果
         */
        public static boolean verify(String text, String sign, String key, String input_charset) {
        text = text + key;
        String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
        if(mysign.equals(sign)) {
        return true;
        }
        else {
        return false;
        }
        }


        /**
         * @param content
         * @param charset
         * @return
         * @throws SignatureException
         * @throws UnsupportedEncodingException 
         */
        private static byte[] getContentBytes(String content, String charset) {
            if (charset == null || "".equals(charset)) {
                return content.getBytes();
            }
            try {
                return content.getBytes(charset);
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
            }
        }


    }

         

          /**
    * 生成6位或10位随机数
    * param codeLength(多少位)
    * @return
    */

    private String createCode(int codeLength) {
    String code="";
    for(int i=0; i<codeLength; i++) {
    code += (int)(Math.random() * 9);
    }
    return code;
    }
    private static boolean isValidChar(char ch) {  
            if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z')|| (ch >= 'a' && ch <= 'z'))  
                return true;  
            if ((ch >= 0x4e00 && ch <= 0x7fff) || (ch >= 0x8000 && ch <= 0x952f))  
                return true;// 简体中文汉字编码  
            return false;  
        }



    /** 
         * 除去数组中的空值和签名参数
         * @param sArray 签名参数组
         * @return 去掉空值与签名参数后的新签名参数组
         */
        public static Map<String, String> paraFilter(Map<String, String> sArray) {


            Map<String, String> result = new HashMap<String, String>();


            if (sArray == null || sArray.size() <= 0) {
                return result;
            }


            for (String key : sArray.keySet()) {
                String value = sArray.get(key);
                if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
                    || key.equalsIgnoreCase("sign_type")) {
                    continue;
                }
                result.put(key, value);
            }


            return result;
        }


        /** 
         * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
         * @param params 需要排序并参与字符拼接的参数组
         * @return 拼接后字符串
         */
        public static String createLinkString(Map<String, String> params) {


            List<String> keys = new ArrayList<String>(params.keySet());
            Collections.sort(keys);


            String prestr = "";


            for (int i = 0; i < keys.size(); i++) {
                String key = keys.get(i);
                String value = params.get(key);


                if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
                    prestr = prestr + key + "=" + value;
                } else {
                    prestr = prestr + key + "=" + value + "&";
                }
            }


            return prestr;
        }


    /**
    * 发送现金红包
    * @throws KeyStoreException 
    * @throws IOException 
    * @throws CertificateException 
    * @throws NoSuchAlgorithmException 
    * @throws UnrecoverableKeyException 
    * @throws KeyManagementException 
    * @throws DocumentException 
    */
    public void sendRedPack() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, UnrecoverableKeyException, DocumentException {
    // 获取uuid作为随机字符串
    String nonceStr = uuidGenerator.generate();
    String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
    String code = createCode(10);
    String mch_id = "10000100";//商户号
    String appid = "wxd930ea5d5a258f4f";
    String opendid = "xxxxxxxxxxxxxxxxx"; //发送给指定微信用户的openid
    SendRedPackPo sendRedPackPo = new SendRedPackPo();
    String totalAmount = "1";

    sendRedPackPo.setNonce_str(nonceStr);
    sendRedPackPo.setMch_billno(mch_id + today + code);
    sendRedPackPo.setMch_id(mch_id);
    sendRedPackPo.setWxappid(appid);
    sendRedPackPo.setNick_name("xxx");
    sendRedPackPo.setSend_name("xxx");
    sendRedPackPo.setRe_openid(opendid);
    sendRedPackPo.setTotal_amount(totalAmount);
    sendRedPackPo.setMin_value(totalAmount);
    sendRedPackPo.setMax_value(totalAmount);
    sendRedPackPo.setTotal_num("1");
    sendRedPackPo.setWishing("祝您新年快乐!");
    sendRedPackPo.setClient_ip("192.168.1.1"); //IP
    sendRedPackPo.setAct_name("小游戏");
    sendRedPackPo.setRemark("快来抢红包!");


    //把请求参数打包成数组
    Map<String, String> sParaTemp = new HashMap<String, String>();
    sParaTemp.put("nonce_str", sendRedPackPo.getNonce_str());
            sParaTemp.put("mch_billno", sendRedPackPo.getMch_billno());
            sParaTemp.put("mch_id", sendRedPackPo.getMch_id());
    sParaTemp.put("wxappid", sendRedPackPo.getWxappid());
    sParaTemp.put("nick_name", sendRedPackPo.getNick_name());
    sParaTemp.put("send_name", sendRedPackPo.getSend_name());
    sParaTemp.put("re_openid", sendRedPackPo.getRe_openid());
    sParaTemp.put("total_amount", sendRedPackPo.getTotal_amount());
    sParaTemp.put("min_value", sendRedPackPo.getMin_value());
    sParaTemp.put("max_value", sendRedPackPo.getMax_value());
    sParaTemp.put("total_num", sendRedPackPo.getTotal_num());
    sParaTemp.put("wishing", sendRedPackPo.getWishing());
    sParaTemp.put("client_ip", sendRedPackPo.getClient_ip());
    sParaTemp.put("act_name", sendRedPackPo.getAct_name());
    sParaTemp.put("remark", sendRedPackPo.getRemark());


            //除去数组中的空值和签名参数
            Map<String, String> sPara = paraFilter(sParaTemp);
    String prestr = createLinkString(sPara); //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
    String key = "&key=192006250b4c09247ec02edce69f6a2d"; //商户支付密钥
    String mysign = MD5.sign(prestr, key, "utf-8").toUpperCase();
            
    sendRedPackPo.setSign(mysign);

            
    String respXml = MessageUtil.messageToXml(sendRedPackPo);

    //打印respXml发现,得到的xml中有“__”不对,应该替换成“_”
    respXml = respXml.replace("__", "_");


            // 将解析结果存储在HashMap中
    Map<String, String> map = new HashMap<String, String>();


    KeyStore keyStore  = KeyStore.getInstance("PKCS12");
            FileInputStream instream = new FileInputStream(new File("/home/apiclient_cert.p12")); //此处为证书所放的绝对路径
            
            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.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
            CloseableHttpClient httpclient = HttpClients.custom()
                    .setSSLSocketFactory(sslsf)
                    .build();
            
            try {


                HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
                
                StringEntity  reqEntity  = new StringEntity(respXml, "utf-8");
                
                // 设置类型 
                reqEntity.setContentType("application/x-www-form-urlencoded"); 
                
                httpPost.setEntity(reqEntity);
                
                System.out.println("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)
                map.put(e.getName(), e.getText());


                // 释放资源
                inputStream.close();
                inputStream = null;


                    }
                    EntityUtils.consume(entity);
                } finally {
                    response.close();
                }
            } finally {
                httpclient.close();
            }


    // 返回状态码
    String return_code = map.get("return_code");
    // 返回信息
    String return_msg = map.get("return_msg");
    // 业务结果
    String result_code = map.get("result_code");
    // 错误代码
    String err_code = map.get("err_code");
    // 错误代码描述
    String err_code_des = map.get("err_code_des");

    /**
    * 根据以上返回码进行业务逻辑处理
    */
    .
    .
    .
    .

    }


    MessageUtil工具类,在柳峰老师的博客里有的。

    代码中httpclient-4.3.4.jar没有放上去,麻烦小伙伴们自己找下吧。

    实现效果:











    如果小伙伴们觉得有什么问题,可以联系讨论。

    展开全文
  • 需要做红包功能的可以找我,收费卖源码,也承接开发。此博文仅示例。 流程效果图: 图片1触发wx.sendBizRedPacket({})吊起图片2,点击开,出现图片3,关闭以后出现图片4。 wx.sendBizRedPacket({})说明及示例: ...

     有问题可以扫码加我微信,有偿解决问题。承接小程序开发。

    微信小程序开发交流qq群   581478349;

    正文:

    需要做红包功能的可以找我,收费卖源码,也承接开发。此博文仅示例。

    流程效果图:

    图片1触发wx.sendBizRedPacket({})吊起图片2,点击开,出现图片3,关闭以后出现图片4。

    wx.sendBizRedPacket({})说明及示例:

     wx.sendBizRedPacket({
       timeStamp: e.timeStamp,
       nonceStr: e.nonceStr,
       package: e.package,
       signType: e.signType,
       paySign: e.paySign,
       success: function(res) {
         console.log('红包success')
         let url = config.HTTP_Prize_URL + '/v1/sign_tmp/sendSuccess.do';
         let data = {
           minipid: that.data.minipid,
           date: that.data.date
         }
         console.log('红包成功以后接口请求参数数据:' + JSON.stringify(data))
         util.request(url, 'post', data, '正在加载数据', function(res) {
           console.log('红包成功以后接口返回结果:' + JSON.stringify(res.data))
         })
         wx.reLaunch({
           url: '../my_prize/my_prize_2?reward=' + res.data.body.reward,
         })
       },
       fail: function(res) {
         console.log('红包fail')
       },
       complete: function(res) {
         console.log('红包complete') 
    // wx.showModal({       
     //   title: '红包complete',     
       //   content: '红包complete',     
       // })   
       }
     })

    承接web开发;

    V:

    展开全文
  • 开发结合THINKPHP; 效果图: step:1 写一个红包工具类; 目录为__ROOT__\ThinkPHP\Library\Vendor\phpPay\WxPayPubHelper\WxPayPubHelper.php /* * 红包工具类 * */ class bonus_pub extends Wxpay...

    此开发结合THINKPHP;

    效果图:

     

    step:1 写一个红包工具类; 目录为__ROOT__\ThinkPHP\Library\Vendor\phpPay\WxPayPubHelper\WxPayPubHelper.php

    /*
     * 红包工具类
     * */
    class bonus_pub extends Wxpay_client_pub{
        function __construct()
        {
            //设置接口链接
            $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
            //设置curl超时时间
            $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
        }
    
        /**
         * 生成接口参数xml
         */
        function createXml()
        {
            try
            {
    
                //检测必填参数
                if($this->parameters["mch_billno"] == null)
                {
                    throw new SDKRuntimeException("缺少红包接口必填参数mch_billno!"."<br>");
                }elseif($this->parameters["send_name"] == null){
                    throw new SDKRuntimeException("缺少红包接口必填参数send_name!"."<br>");
                }elseif ($this->parameters["act_name"] == null ) {
                    throw new SDKRuntimeException("缺少红包接口必填参数act_name!"."<br>");
                }elseif ($this->parameters["total_num"] == null) {
                    throw new SDKRuntimeException("缺少红包接口必填参数total_num!"."<br>");
                }elseif ($this->parameters["total_amount"] == null) {
                    throw new SDKRuntimeException("缺少红包接口必填参数total_amount!"."<br>");
                }elseif ( $this->parameters["re_openid"] == NULL){
                    throw new SDKRuntimeException("缺少红包接口必填参数 openid!"."<br>");
                }elseif($this->parameters["remark"] == NULL){
                    throw new SDKRuntimeException("缺少红包接口必填参数 remark!"."<br>");
                }elseif($this->parameters["wishing"] == NULL){
                    throw new SDKRuntimeException("缺少红包接口必填参数 wishing!"."<br>");
                }
                $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
                $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
                $this->parameters["client_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
                $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
                $this->parameters["sign"] = $this->getSign($this->parameters);//签名
    
                return  $this->arrayToXml($this->parameters);
            }catch (SDKRuntimeException $e)
            {
                die($e->errorMessage());
            }
        }
    
        /**
         * 发红包 并且获取返回值
         */
        function send_bouns()
        {
            $this->postXmlSSL();
            $this->result = $this->xmlToArray($this->response);
            return $this->result;
        }
    }

    step2 写一个红包调用类;__ROOT__\ThinkPHP\Library\Vendor\phpPay\demo\Bonus.PHP

      

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 15-9-8
     * Time: 下午6:07
     */
    header("Content-type:text/html;charset=utf-8");
    class bonus extends \Think\Controller{
    
        public function bonus(){
            //构造方法
            vendor ( 'phpPay.WxPayPubHelper.WxPayPubHelper' );
        }
    
        /*openid 和红包金额*/
        public function sendBonus($openid,$fee){
    
            $fee = $fee*100;
            $bouns = new \bonus_pub();
            $mch_billno = WxPayConf_pub::MCHID.time().rand(0,100);
            $bouns->setParameter("wxappid",WxPayConf_pub::APPID);//总金额
            $bouns->setParameter("mch_billno","$mch_billno");//商户订单号
            $bouns->setParameter("send_name","Gosstech");//红包发送者名称
            $bouns->setParameter("re_openid","$openid");//用户openid
            $bouns->setParameter("total_amount","$fee");//总金额
            $bouns->setParameter("total_num","1");//红包发放总人数
            $bouns->setParameter("wishing","好人一生平安,gosstech公益基金会");//附加数据 订单ID
            $bouns->setParameter("act_name","公益红包");//活动名称
            $bouns->setParameter("remark","一起做公益吧");//备注
            $res = $bouns->send_bouns();
            return $res;
        }
    
    }

    step3  测试: 写一个控制器;随意;

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 15-9-9
     * Time: 下午4:03
     */
    
    namespace Pay\Controller;
    use Think\Controller;
    class BonusController extends Controller {
        public function sendBouns(){
            vendor ( 'phpPay.demo.bonus' );
            $bonus = new \bonus();
            $bonus->sendBonus('oc8rujitiX4ghHtvP57WvQQW4-UA',1);
        }
    } 

     

    转载于:https://www.cnblogs.com/bin-pureLife/p/4796765.html

    展开全文
  • 2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验 现金红包官网文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?
  • 微信官方文档 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_3&index=2 一、准备工作 1、开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包...
  • 微信开发五之微信红包开发

    千次阅读 2018-01-18 10:20:24
    微信支付的开发,作为微信公众号开发的难点之一,另不少开发者颇为头痛。市面上微信支付开发成本动辄上万,也让刚创业的小公司无力负担。本次文章将详细介绍微信支付中微信原生红包开发思路,并提供源代码。以供...
  • 公众号开发: 给用户发红包

    千次阅读 2018-07-31 14:11:48
    2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验 现金红包官网文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapte...
  • 微信小程序如何发红包

    万次阅读 2018-07-20 11:25:19
    文章开头先提一点,如果小程序可以开通企业支付接口,那推荐直接使用企业支付接口来实现红包的功能,小程序链接公众号通过公众号的红包接口来实现是非常坑爹的一件事...本文说下如果联通小程序和公众号来实现发红包...
  • 本文主要介绍Java微信公众号、微信小程序支付和提现相关的开发流程。请注意,支付是用户微信商户付款,提现是微信商户向用户付款或者发送红包。 阅读本文前需掌握微信公众平台开发微信小程序开发微信支付等...
  • /*测试微信企业个人发红包*/public function weixin_red_packet(){ // 请求参数 // 随机字符串 $data['nonce_str']=$this-&gt;get_unique_value(); //签名 $data['sign']=""; //商户号,输入你的...
  • 前一阵子做了个微信发放普通红包的功能,在这记录下开发思路 二、微信官网 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3 三、发放规则与注意事项 发放规则: 发送...
  • 给用户发红包 用户买了商品,剩下的钱,可以自己再提出来。 问题1我纠结了好久,并没有找到合适解决方法,因为按照这个要求,操作由后台发起,由后台执行,而这样做,微信是不允许的,这也是为什么我会写一篇关于...
  • 微信小程序发红包

    2019-07-21 04:38:49
    小程序开发倒是不难,不过要使用小程序给微信用户发红包,这个就有点麻烦 确定模式: 小程序目前没有发红包接口,要实现的话,只能是模拟红包,即小程序上做出红包的效果,实质使用别的支付方式代替 1、首先...
  • 微信商户发红包和获取用户信息

    千次阅读 2016-09-08 09:33:44
    前几天用java实现了微信商户发红包给用户的功能。现在整理一下,方便以后参考。总体的步骤是: - 1.在微信客户端转发自己的uri路径 - 2.拿到微信授权的Code - 3.获取用户openID - 4.获取用户信息 - 5.给指定...
  • 微信红包,2014年春节一经推出即受到广大用户好评,引发全民抢红包热潮。现将微信红包打造成“现金红包”,成为一款定向资金发放的营销工具,供商户使用. 二、 什么商户有资格申请 只要您开通了微信支付,并使用...
  • JAVA微信现金红包开发教程

    千次阅读 热门讨论 2018-05-07 14:08:35
    1.首先做微信方面的开发,一定需要详细的阅读微信支付的开发文档。因为里面列举了比如消息的触达规则,接口调用的请求说明,请求的参数,错误返回示例以及成功返回示例,阅读这些,在出错了我们能够快速定位并且解决...
  • 用HTML喝java做的用户分享之后就直接一个红包请问个位大神怎样做
  • 微信开发之现金红包

    千次阅读 2019-06-23 16:30:55
    欢迎留言、转发 ...此文来聊聊微信商户中的支付工具—-现金红包准备工作【官方文档】一、开通现金红包权限在使用现金红包之前,请前往开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金
  • 微信服务号已开通微信支付,需要实现一个关注即给用户发送红包,不知道在哪里编辑代码,有具体的实现方法吗,开发文档看不大懂,不知道在哪实践,求大神告知。
1 2 3 4 5 ... 20
收藏数 3,072
精华内容 1,228
关键字:

微信开发给用户发红包