企业微信开发之向员工付款(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、请求示例
1 <xml> 2 <appid>wxe062425f740c30d8</appid> 3 <mch_id>1900000109</mch_id> 4 <device_info>013467007045764</device_info> 5 <nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str> 6 <sign>C97BDBACF37622775366F38B629F45E3</sign> 7 <partner_trade_no>100000982017072019616</partner_trade_no> 8 <openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid> 9 <check_name>NO_CHECK</check_name> 10 <re_user_name>张三</re_user_name> 11 <amount>100</amount> 12 <desc>六月出差报销费用</desc> 13 <spbill_create_ip>10.2.3.10</spbill_create_ip> 14 <workwx_sign>99BCDAFF065A4B95628E3DB468A874A8</workwx_sign> 15 <ww_msg_type>NORMAL_MSG</ww_msg_type> 16 <act_name>示例项目</act_name> 17 </xml>
三、实现代码
1 WxPayData data = new WxPayData(); 2 data.SetValue("appid", WxPayConfig.APPID);//公众账号ID 3 data.SetValue("mch_id", WxPayConfig.MCHID);//商户号 4 data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); 5 6 data.SetValue("partner_trade_no",WxPayApi.GenerateOutTradeNo()); 7 string openid = ConvertToOpenidByUserId(_accessToken,"13212345678"); 8 var openInfo = JsonConvert.DeserializeObject<U_OpenInfo>(openid); 9 data.SetValue("openid", openInfo.openid); //商户appid下,某用户的openid 10 data.SetValue("check_name", "NO_CHECK"); //校验用户姓名选项(NO_CHECK:不校验真实姓名FORCE_CHECK:强校验真实姓名) 11 data.SetValue("amount",100); //金额,单位为分 12 data.SetValue("desc","六月份出差报销");//付款说明 13 data.SetValue("spbill_create_ip", "192.168.0.1");//Ip地址 14 data.SetValue("ww_msg_type", "NORMAL_MSG"); //付款消息类型 15 data.SetValue("act_name", "示例项目"); //项目名称 16 data.SetValue("workwx_sign", data.MakeWorkWxSign("payment")); //企业微信签名 17 data.SetValue("sign", data.MakeSign()); //微信支付签名 18 string xml = data.ToXml(); 19 string response = PostWebRequest(postUrl, xml, Encoding.UTF8, true);//调用HTTP通信接口提交数据到API 20 WxPayData result = new WxPayData(); 21 result.FromXml(response);
1 /// <summary> 2 /// Post数据接口 3 /// </summary> 4 /// <param name="postUrl">接口地址</param> 5 /// <param name="jsonData">提交json数据</param> 6 /// <param name="dataEncode">编码方式</param> 7 /// <param name="isUseCert">是否使用证书</param> 8 /// <returns></returns> 9 protected string PostWebRequest(string postUrl, string jsonData, Encoding dataEncode, bool isUseCert = false) 10 { 11 string ret = string.Empty; 12 try 13 { 14 byte[] byteArray = dataEncode.GetBytes(jsonData); //转化 15 HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl)); 16 webReq.Method = "POST"; 17 webReq.ContentType = "application/x-www-form-urlencoded"; 18 19 webReq.ContentLength = byteArray.Length; 20 if (isUseCert) 21 { 22 string path = AppDomain.CurrentDomain.BaseDirectory; 23 X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD); 24 webReq.ClientCertificates.Add(cert); 25 } 26 Stream newStream = webReq.GetRequestStream(); 27 newStream.Write(byteArray, 0, byteArray.Length);//写入参数 28 newStream.Close(); 29 HttpWebResponse response = (HttpWebResponse)webReq.GetResponse(); 30 StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 31 ret = sr.ReadToEnd(); 32 sr.Close(); 33 response.Close(); 34 newStream.Close(); 35 } 36 catch (Exception ex) 37 { 38 return ex.Message; 39 } 40 return ret; 41 }
四、注意事项
计算企业微信签名
付款ap有且仅有如下几个字段参与签名:
amount
appid
desc
mch_id
nonce_str
openid
partner_trade_no
ww_msg_type
不要将参数全部参与计算签名,否则会返回微信签名错误!