企业微信开发之向员工付款(C#)
一、企业微信API
地址:http://work.weixin.qq.com/api/doc#11545
二、参数说明
1、向员工付款
请求方式:POST(HTTPS)
请求地址:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/paywwsptrans2pocket
是否需要证书:请求需要双向证书。 详见证书使用
请求方式:POST
数据格式:xml
参数说明:
| 字段名 | 字段 | 必填 | 示例值 | 类型 | 说明 |
|---|---|---|---|---|---|
| 公众账号appid | appid | 是 | wx8888888888888888 | String | 微信分配的公众账号ID(企业号corpid即为此appid) |
| 商户号 | mch_id | 是 | 1900000109 | String(32) | 微信支付分配的商户号 |
| 设备号 | device_info | 否 | 013467007045764 | String(32) | 微信支付分配的终端设备号 |
| 随机字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 随机字符串,不长于32位 |
| 微信支付签名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 参见“签名算法” |
| 商户订单号 | partner_trade_no | 是 | 10000098201411111234567890 | String | 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号) |
| 用户openid | openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String | 商户appid下,某用户的openid |
| 校验用户姓名选项 | check_name | 是 | FORCE_CHECK | String | NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名 |
| 收款用户姓名 | re_user_name | 否 | 马花花 | String | 收款用户真实姓名。 如果check_name设置为FORCE_CHECK,则必填用户真实姓名 |
| 金额 | amount | 是 | 10099 | int | 企业微信企业付款金额,单位为分 |
| 付款说明 | desc | 是 | 六月出差报销费用 | String | 向员工付款说明信息。必填 |
| Ip地址 | spbill_create_ip | 是 | 192.168.0.1 | String | 调用接口的机器Ip地址 |
| 企业微信签名 | workwx_sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(128) | 参见“签名算法” |
| 付款消息类型 | ww_msg_type | 是 | NORMAL_MSG | String | NORMAL_MSG:普通付款消息 APPROVAL _MSG:审批付款消息 |
| 审批单号 | approval_number | 否 | 201705160008 | String | ww_msg_type为APPROVAL _MSG时,需要填写approval_number |
| 审批类型 | approval_type | 否 | 1 | int | ww_msg_type为APPROVAL _MSG时,需要填写1 |
| 项目名称 | act_name | 是 | 产品部门报销 | String | 项目名称 |
2、请求示例
<xml>
<appid>wxe062425f740c30d8</appid>
<mch_id>1900000109</mch_id>
<device_info>013467007045764</device_info>
<nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
<sign>C97BDBACF37622775366F38B629F45E3</sign>
<partner_trade_no>100000982017072019616</partner_trade_no>
<openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid>
<check_name>NO_CHECK</check_name>
<re_user_name>张三</re_user_name>
<amount>100</amount>
<desc>六月出差报销费用</desc>
<spbill_create_ip>10.2.3.10</spbill_create_ip>
<workwx_sign>99BCDAFF065A4B95628E3DB468A874A8</workwx_sign>
<ww_msg_type>NORMAL_MSG</ww_msg_type>
<act_name>示例项目</act_name>
</xml>
三、实现代码
WxPayData data = new WxPayData();
data.SetValue("appid", WxPayConfig.APPID);//公众账号ID
data.SetValue("mch_id", WxPayConfig.MCHID);//商户号
data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); data.SetValue("partner_trade_no",WxPayApi.GenerateOutTradeNo());
string openid = ConvertToOpenidByUserId(_accessToken,"");
var openInfo = JsonConvert.DeserializeObject<U_OpenInfo>(openid);
data.SetValue("openid", openInfo.openid); //商户appid下,某用户的openid
data.SetValue("check_name", "NO_CHECK"); //校验用户姓名选项(NO_CHECK:不校验真实姓名FORCE_CHECK:强校验真实姓名)
data.SetValue("amount",); //金额,单位为分
data.SetValue("desc","六月份出差报销");//付款说明
data.SetValue("spbill_create_ip", "192.168.0.1");//Ip地址
data.SetValue("ww_msg_type", "NORMAL_MSG"); //付款消息类型
data.SetValue("act_name", "示例项目"); //项目名称
data.SetValue("workwx_sign", data.MakeWorkWxSign("payment")); //企业微信签名
data.SetValue("sign", data.MakeSign()); //微信支付签名
string xml = data.ToXml();
string response = PostWebRequest(postUrl, xml, Encoding.UTF8, true);//调用HTTP通信接口提交数据到API
WxPayData result = new WxPayData();
result.FromXml(response);
/// <summary>
/// Post数据接口
/// </summary>
/// <param name="postUrl">接口地址</param>
/// <param name="jsonData">提交json数据</param>
/// <param name="dataEncode">编码方式</param>
/// <param name="isUseCert">是否使用证书</param>
/// <returns></returns>
protected string PostWebRequest(string postUrl, string jsonData, Encoding dataEncode, bool isUseCert = false)
{
string ret = string.Empty;
try
{
byte[] byteArray = dataEncode.GetBytes(jsonData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.ContentType = "application/x-www-form-urlencoded"; webReq.ContentLength = byteArray.Length;
if (isUseCert)
{
string path = AppDomain.CurrentDomain.BaseDirectory;
X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
webReq.ClientCertificates.Add(cert);
}
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, , byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception ex)
{
return ex.Message;
}
return ret;
}
四、注意事项
计算企业微信签名
付款ap有且仅有如下几个字段参与签名:
amount
appid
desc
mch_id
nonce_str
openid
partner_trade_no
ww_msg_type
不要将参数全部参与计算签名,否则会返回微信签名错误!
五、实现效果

企业微信开发之向员工付款(C#)的更多相关文章
- 如何用php开启企业微信开发的回调模式
猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/ ...
- Java企业微信开发_03_通讯录同步
一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...
- Java企业微信开发_07_素材管理之上传本地临时素材文件
一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要 ...
- Java企业微信开发_05_消息推送之发送消息(主动)
一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接 ...
- Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)
注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...
- Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器
一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要 ...
- Java企业微信开发_05_消息推送之被动回复消息
一.本节要点 1.消息的加解密 微信加解密包 下载地址:http://qydev.weixin.qq.com/java.zip ,此包中封装好了AES加解密方法,直接调用方法即可. 其中,解 ...
- Java企业微信开发_04_消息推送之发送消息(主动)
源码请见: Java企业微信开发_00_源码及资源汇总贴 一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息 ...
- Java企业微信开发_03_自定义菜单
一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式.关于json序列 ...
随机推荐
- 201521123098 《Java程序设计》第2周学习总结
1. 本周学习总结 1. 熟悉了一些码云中储存eclipse中代码的操作,利于随时储存代码,避免U盘丢失导致代码丢失的问题: 2. 了解了如何从码云中提取已储存的代码: 3. 学会了如何创建动态数组, ...
- 控制结构(5) 必经之地(using)
// 上一篇:局部化(localization) // 下一篇:最近最少使用(LRU) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 前情回顾 上一周,我们谈到了分支/卫语句 ...
- js的原型
在讲js的原型之前,必须先了解下Object和Function. Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是 ...
- linux c函数指针的应用
头文件:1.h #include<stdio.h> int nul_func(); int test1(int a,int b); int test2(int a,int b,int c) ...
- 关于linux下的文件权限
在ls指令加 -l 参数能看到文件权限 就像这样: drwxrwxr-x 2 asml users 4096 Jul 24 02:45 desktop 第一个d表示这是个目录,若为"-&qu ...
- [Node.js] 2、利用node-git-server快速搭建git服务器
本文用到了node-git-server 1.检测本地git版本 该包的使用需要机器上本来就安装git,且git的版本大于等于2.7: ╭─root@lt /home/workspace ╰─# gi ...
- TCP/IP(三)数据链路层~2
一.局域网 1.1.局域网和以太网的区别和联系 局域网:前面已经介绍了,其实就是学校里面.各个大的公司里,自己组件的一个小型网络,这种就属于局域网. 以太网:以太网(Ethernet)指的是由Xero ...
- Oculus Store游戏下载默认路径修改方法
最近在测试一款VR游戏,所以在硬件设备上选择了HTC Vive和Oculus两款眼镜.相对而言,HTC安装比较人性化:支持自定义安装路径,而且可在界面更改应用程序下载位置,如图所示: 这下替我节省了不 ...
- M方法
ThinkPHP函数详解:M方法 M方法用于实例化一个基础模型类,和D方法的区别在于:1.不需要自定义模型类,减少IO加载,性能较好:2.实例化后只能调用基础模型类(默认是Model类)中的方法:3. ...
- 使用paramiko远程执行
写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...