企业微信支付的发送红包及相关接口使用

 企业微信的支付自从企业号变化为企业微信后,增加了一些支付接口以及对很多接口进行了调整,企业微信的支付处理也是变化了不少,往往有时候碰到不少坑,一步一个脚印趟过来的;企业微信支付是需要结合微信商户后台进行处理,有时候也需要设置好商户平台的相关处理,才能进行发送红包、支付到个人等等支付处理。本篇随笔介绍在企业微信的支付处理中的发送红包的操作相关内容。

1、企业微信的支付接口

我们查看企业微信API的目录,可以看到企业微信支付的相关介绍,如下所示。

 

1)常见错误处理

企业微信支付,经常见到的错误信息,就是签名错误这个操作,这个很多人出招,解决方法各种各样,其实很多可能是不符合的,这样排查问题起来就很吃力。

这里需要遵循官方的解析进行排查,特别对参数的顺序和数量进行核对,注意不要增加多一个参数,否则都容易出现签名错误。

我就是在官方需要参数都有了,打印输出的格式也没问题,就是不小心多了一个参数(还是升级前有的一个),导致错误很难排查,弄得很头大。

一般来说发送企业红包,很容易发生签名错误的情况,请检查以下内容
 1、企业微信的CorpID/CorpSecret
 2、企业微信的支付Secret和商户的API支付秘钥
 3、参数不能多也不能少(重要),如很多时候由于版本原因这里不小心多了一个total_num导致签名错误
 4、商户平台的证书和密码是否正确

另外,除了这些问题外,重要的问题就是签名的处理了,微信支付除了有一个常规的签名sign参数外,还增加了一个workwx_sign的参数,两者的规则是不同的。

workwx_sign参数在前,使用系统给出的计算方式计算后,然后在计算sign参数,sign参数的计算是包含本身之外的所有参数进行计算,包括了workwx_sign参数。

2)签名参数处理

对于企业微信的签名workwx_sign参数,不要将参数全部参与计算签名,否则会返回微信签名错误!

发红包api固定如下几个字段参与签名:
act_name
mch_billno
mch_id
nonce_str
re_openid
total_amount
wxappid

付款api固定如下几个字段参与签名:
amount
appid
desc
mch_id
nonce_str
openid
partner_trade_no
ww_msg_type

计算企业微信签名的字符串最后拼的secret是企业微信管理端支付应用页面的secret,如下图所示。

示例:请求内容:
act_name XXX
mch_billno 11111234567890
mch_id 10000098
nonce_str qFKEgfig76DF9912fewmkp
re_openid oxTWIuGaIt6gTKsQRLau2M0yL16E
total_amount 100
wxappid wx123456789

第一步: 对参数按照key=value的格式,并按照参数名ASCII字典序排序如下
stringA=”act_name=XXX&mch_billno=11111234567890&mch_id=10000098&nonce_str=qFKEgfig76DF9912fewmkp&re_openid=oxTWIuGaIt6gTKsQRLau2M0yL16E&total_amount=100&wxappid=wx123456789
第二步:拼接企业微信支付应用secret(参见企业微信管理端支付应用页面):
stringSignTemp=”stringA&secret=192006250b4c09247ec02edce69f6a2d”
sign=MD5(stringSignTemp).toUpperCase()

 

2、企业微信发送红包

测试企业微信发送红包和直接支付的接口,响应效果如下所示

在企业微信中,常用到的企业微信的userid,不过发送红包则需要把userid转换为微信的openid进行使用,转换函数根据UserID 换取用户的OpenId 如下。

一般封装一个函数来使用即可。

复制代码
        private string GetOpenId(string userid)         {             //根据UserID 换取用户的OpenId            ICorpBasicApi basicAPi = new CorpBasicApi();             return basicAPi.ConvertToOpenId(this.token, userid);         }
复制代码

发送企业红包调用如下代码所示

复制代码
//构建发送红包的参数信息SendRedPackJson packJson = new SendRedPackJson() {      act_name = "恭喜发财",     client_ip = NetworkUtil.GetIPAddress(),     remark = "企业红包",     wishing = "企业红包",     total_amount = 100,     total_num = 1,     re_openid = openid //发送给用户的OpenID};  //调用发送企业红包接口发送var result = hbApi.SendWorkRedPack(packJson);
复制代码

函数SendWorkRedPack的实现内容如下所示。

复制代码
        /// <summary>        /// 发放企业红包。需要商户证书         /// </summary>        /// <param name="json"></param>        /// <returns></returns>        public SendRedPackResult SendWorkRedPack(SendRedPackJson json)         {             CheckAccount();//检查AccountInfo的对象属性值              //加入常规的参数            WxPayData data = new WxPayData();             data.SetValue("nonce_str", data.GenerateNonceStr());//随机字符串             //商户订单号(每个订单号必须唯一) 组成:mch_id+yyyymmdd+10位一天内不能重复的数字。             //接口根据商户订单号支持重入,如出现超时可再调用。            data.SetValue("mch_billno", data.GenerateOutTradeNo(AccountInfo.MchID));             data.SetValue("mch_id", AccountInfo.MchID);//商户号            data.SetValue("wxappid", AccountInfo.AppID);//公众账号appid
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信