一、开发前准备
1)企业微信
2)商户号(微信支付商户平台账号)
3)wx-pay SDK, JSSDK
二、开发前了解开发文档,以及相关概念。
官方文档地址:https://work.weixin.qq.com/api/doc#90000/90135/90280。
先来了解企业支付需要的一些相关概念:
1、corpid:每个企业都拥有唯一的corpid,获取此信息可在管理后台"我的企业" - "企业信息"下查看"企业ID"(需要有管理员权限)。
2、userid:每个成员都有唯一的userid,即所谓的"账号"。在管理后台->"通讯录"->点进某个成员的详情页,可以看到。
3、agentid:每个应用都有唯一的agentid。在管理后台->"应用与小程序"->"应用",点进某个应用,即可以看到agentid。
4、secret:secret是企业应用里面用于报障数据安全的"钥匙",每个应用都有一个独立的访问密钥,为了保证数据的安全,secret不能泄露。
5、access_token:access_token是企业后台去企业微信的后台获取信息时的重要票据,由corpid和secret产生。所有接口在通信时都要携带此信息用于验证接口的访问权限。
企业支付分为:企业红包、向员工付款、向员工收款三类。如下图所示,此次主要详说向员工收款。
按文档介绍,第一步,开通企业微信专区。第二步,获取用户openid。第三步,添加JSAPI的权限验证。第四步,发起向员工收款。第五步,调用支付JSAPI完成支付。
第一步就不讲了,因为我没有企业微信管理员账号,都是让人给配置好了,我再用的。
将上面的步骤文字转换为图来看 ,过程就比较清晰明了了。(如下图)
1)首先获取access_token。
请求方式: GET(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
需要两个参数,corpid和corpsecret,就是前面的概念介绍的企业id和应用id。获取到的access_token有效时间为7200秒即两小时,因为获取access_token的接口有访问次数限制,所以我们需要把获
取到的access_token缓存起来。这个access_token是我们访问其他接口要用到的。(注意access_token可能会提前失效,逻辑中要判断失效重新调接口获取)。
2)获取用户openid
在H5页面上发起向员工收款,需要获取到用户的openid信息,但在企业微信上我们没有直接获取openid的API,需要先获取到userid,再通过userid转换为openid。获取useid需要构造网页授权链接,
通过链接获取code参数,再通过code参数获取用户userid信息。
2.1)构造网页授权地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
这里的参数如下图说明:
这里state是选填的,但是一般还是带上,企业微信会原样返回你给的参数,可以拿这个区分自己是通过哪个方法去请求网页授权的。redirect_uri需要用urlencode处理。构造好网页授权地址后,访问后,页面会跳转到redirect_uri给的地址,并带上code和原样返回的state参数。拿到code后我们就可以用code获取userid了。(注意:code只有5分钟的有效期,并且只能使用一次)
2.2)获取访问用户身份
请求方式:GET(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
这里两个参数access_token和code就是前两步我们获取到的。
权限说明:跳转的域名须完全匹配access_token对应应用的可信域名,否则会返回50001错误。(这个是在第一步,开通企业微信专区那儿设置的)
请求之后,就会返回用户身份信息了,里面包含userid。返回数据格式:{
"errcode": 0,
"errmsg": "ok",
"UserId":"USERID",
"DeviceId":"DEVICEID"
}
2.3)userid转换为openid
请求方式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid?access_token=ACCESS_TOKEN
这里需要两个参数一个是access_token放在url地址里,另一个是userid。userid不能拼接在地址后面,需要放到body里面并且是json格式。提供一个方法来进行post请求。
1 public static JSONObject doJsonPost(String url, JSONObject jsonObject) { 2 HttpClient client = HttpClientBuilder.create().build(); 3 HttpPost post = new HttpPost(url); 4 JSONObject response = null; 5 6 try { 7 StringEntity s = new StringEntity(jsonObject.toString()); 8 s.setContentEncoding("UTF-8"); 9 s.setContentType("application/json"); 10 post.setEntity(s); 11 HttpResponse res = client.execute(post); 12 if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 13 HttpEntity entity = res.getEntity(); 14 String result = EntityUtils.toString(entity); 15 response = JSONObject.parseObject(result); 16 } 17 } catch (Exception e) { 18 throw new RuntimeException(e); 19 } 20 return response; 21 }
请求成功返回一个JSONObject{
"errcode": 0,
"errmsg": "ok",
"openid": "oDOGms-6yCnGrRovBj2yHij5JL6E"
},里面包含 openid信息。
3)添加JSAPI权限验证
拿到openid后,就差不多完成了发起支付的前期准备条件,不过调用JSAPI支付之前,需要对请求的JSAPI进行权限验证。在调用JSAPI的页面引入jssdk,地址为https://res2.wx.qq.com/open/js/jweixin-1.4.0.js
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来 appId: ‘appId‘, // 必填,企业微信的corpID timestamp: ‘timestamp‘, // 必填,生成签名的时间戳 nonceStr: ‘noncestr‘, // 必填,生成签名的随机串 signature: ‘signature‘,// 必填,签名 jsApiList: [‘getBrandWCPayRequest‘] });