看官方文档非常重要!!!文档地址如下:
有两个地方特别要注意:
一、企业微信内部收款需要注意将userid和openID做个转换
请求方式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid?access_token=ACCESS_TOKEN
请求示例:
{
"userid": "zhangsan"
}
参数说明:
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
userid | 是 | 企业内的成员id |
权限说明:
成员必须处于应用的可见范围内
二、需要添加JS-SDK权限验证
添加JSAPI的权限验证
在网页里通过JSAPI的方式发起支付出于安全因素需要对调用方的身份进行验证,所以开发者需要在页面上添加getBrandWCPayRequest接口的权限验证,验证方式如下:
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
appId: 'appId', // 必填,企业微信的corpID
timestamp: 'timestamp', // 必填,生成签名的时间戳
nonceStr: 'noncestr', // 必填,生成签名的随机串
signature: 'signature',// 必填,签名
jsApiList: ['getBrandWCPayRequest']
});
此处的验证方式和微信公众平台的网页开发签名算法一致,更多关于JSAPI签名算法的完整流程,请参考文档 :JS-SDK签名算法
JS-SDK - 文档 - 企业微信开发者中心 (qq.com)
对于如何进行算法签名按照文档里面的内容一步步操作即可:
1. 获取jsapi_ticket
请求URL:https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN
注意:ticket 需要做一个缓存,他的有效期是7200秒,不能过于频繁调用,我自己是将他存到服务器本地文件中将数据保存为json格式
{
"ticket":####,
"recTime":22222222
}
每次获取ticket先读取这儿文件,recTime内容为上一次写入的时间戳,进行判断,如果跟现在的时间差超过7200,那么重新从腾讯接口去拉取更新的ticket,并写入到文件。实际过程我设置的时间差判断为7000就好了。
2. 签名生成规则如下:
参与签名的参数有四个: noncestr(随机字符串), jsapi_ticket, timestamp(时间戳), url(当前网页的URL, 不包含#及其后面部分)
将这些参数使用URL键值对的格式 (即 key1=value1&key2=value2…)拼接成字符串string1。
有两个注意点:1. 字段值采用原始值,不要进行URL转义;2. 必须严格按照如下格式拼接,不可变动字段顺序。
jsapi_ticket=JSAPITICKET&noncestr=NONCESTR×tamp=TIMESTAMP&url=URL
然后对string1作sha1加密即可。
务必注意大小写的正确,大小写不对也会导致最后的签名不正确
我在这里就调试了半天,我的调用页面url 为 /home/Index 敲代码的时候写成了 /home/index 结果就是折腾到了晚上12点。签名的代码网上找的,有些代码说用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile 但这个是已经过时了。最后找的方法如下
public static getShaRes(string s){
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] bytes_in = System.Text.Encoding.UTF8.GetBytes(s);
byte[] bytes_out = sha1.ComputeHash(bytes_in);
sha1.Dispose();
string result = BitConverter.ToString(bytes_out);
return result.Replace("-", "").ToLower();
}