一、调用微信的JS文件
1.首先要绑定【JS接口安全域名】,“公众号设置”的“功能设置”中
2.引入JS文件
备注:支持使用 AMD/CMD 标准模块加载方法加载
1 <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
3.通过config接口注入权限验证配置
1 wx.config({
2 debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
3 appId: '', // 必填,公众号的唯一标识
4 timestamp: , // 必填,生成签名的时间戳
5 nonceStr: '', // 必填,生成签名的随机串
6 signature: '',// 必填,签名,见附录1
7 jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,这里只写支付的
8 });
4.通过ready接口处理成功验证
1 wx.ready(function(){
2 wx.hideOptionMenu();//隐藏右边的一些菜单
3 });
二、wx.config中的签名
1.首先要获取到access token:公众号的全局唯一票据 。然后根据access token获取到jsapi_ticket:公众号用于调用微信JS接口的临时票据。再用jsapi_ticket获取到签名。
2.获取access token:文档:url:http://mp.weixin.qq.com/wiki/15/54ce45d8d30b6bf6758f68d2e95bc627.html
1 public static Token getToken(String appid, String appsecret) {
2 Token token = null;
3 String requestUrl = Constants.token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
4 // 发起GET请求获取凭证
5 JSONObject jsonObject = CommonUtil.httpsRequestToJsonObject(requestUrl, "GET", null);
6
7 if (null != jsonObject) {
8 try {
9 token = new Token();
10 token.setAccessToken(jsonObject.getString("access_token"));
11 token.setExpiresIn(jsonObject.getInt("expires_in"));
12 } catch (JSONException e) {
13 token = null;
14 // 获取token失败
15 log.error("获取token失败 "+jsonObject.getInt("errcode")+","+jsonObject.getString("errmsg"));
16 }
17 }
18 return token;
19 }
有些方法在前两篇中。
3.获取jsapi_ticket
1 public static Ticket getTicket() {
2 //Constants.ticket_url = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
3 String requestUrl = Constants.ticket_url.replace("ACCESS_TOKEN", TokenThread.accessToken.getAccessToken());
4 // 发起GET请求获取凭证
5 JSONObject jsonObject = CommonUtil.httpsRequestToJsonObject(requestUrl, "GET", null);
6 Ticket ticket = null;
7 String jsapi_ticket = "";
8 int expires_in = 0;
9 if (null != jsonObject) {
10 try {
11 jsapi_ticket = jsonObject.getString("ticket");
12 expires_in = jsonObject.getInt("expires_in");
13 ticket = new Ticket();
14 ticket.setTicket(jsapi_ticket);
15 ticket.setExpiresIn(expires_in);
16 } catch (JSONException e) {
17 // 获取失败
18 log.error("获取jsapi_ticket失败"+jsonObject.getInt("errcode")+","+jsonObject.getString("errmsg"));
19 }
20 }
21 return ticket;
22 }
注意:jsapi_ticket和access token为7200的有效时间。7200后要重新获取,我是放在线程里面死循环的。
4.算签名
1 /**
2 * 签名实体类
3 * @author rory.wu
4 *
5 */
6 public class Signature implements Serializable {
7 private static final long serialVersionUID = -7799030247222127708L;
8
9 private String url;
10 private String jsapi_ticket;
11 private String nonceStr;
12 private String timestamp;
13 private String signature;
14
15 //下面是getset方法
16 }
1 /**
2 * 算出签名
3 * @param jsapi_ticket
4 * @param url 业务中调用微信js的地址
5 * @return
6 */
7 public static Signature sign(String jsapi_ticket, String url) {
8 String nonce_str = CommonUtil.create_nonce_str();
9 String timestamp = CommonUtil.create_timestamp();
10 String string1;
11 String signature = "";
12
13 //注意这里参数名必须全部小写,且必须有序
14 string1 = "jsapi_ticket=" + jsapi_ticket +
15 "&noncestr=" + nonce_str +
16 "×tamp=" + timestamp +
17 "&url=" + url;
18 try
19 {
20 MessageDigest crypt = MessageDigest.getInstance("SHA-1");
21 crypt.reset();
22 crypt.update(string1.getBytes("UTF-8"));
23 signature = CommonUtil.byteToStr(crypt.digest());
24 }
25 catch (NoSuchAlgorithmException e)
26 {
27 e.printStackTrace();
28 }
29 catch (UnsupportedEncodingException e)
30 {
31 e.printStackTrace();
32 }
33
34 Signature result = new Signature();
35 result.setUrl(url);
36 result.setJsapi_ticket(jsapi_ticket);
37 result.setNonceStr(nonce_str);
38 result.setTimestamp(timestamp);
39 result.setSignature(signature);
40
41 return result;
42 }
注意:有些方法在前两篇中
这样就算出签名了。
5.传递到前端页面
把随机字符串:nonce_str,timestamp时间戳,appId,签名,包装为prepay_id=prepay_id的预支付ID传递到前端。
1 wx.config({
2 appId: '${appId}', // 必填,公众号的唯一标识
3 timestamp: ${timestamp}, // 必填,生成签名的时间戳
4 nonceStr: '${nonceStr}', // 必填,生成签名的随机串
5 signature: '${signature}',// 必填,签名,见附录1
6 jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
7 });
6.现在就可以使用微信JS了。
三、调用微信支付
在前一篇中已经获取到了预支付订单的ID,prepay_id,
1 /**
2 * 微信支付对象
3 * @author rory.wu
4 *
5 */
6 public class WxPay implements Serializable {
7 private static final long serialVersionUID = 3843862351717555525L;
8 private String paySign;
9 private String prepay_id;
10 private String nonce_str;
11 private String timeStamp;
12
13 //get,set方法
14 }
1 /**
2 * 获取页面上weixin支付JS所需的参数
3 * @param map
4 * @return
5 */
6 private WxPay getWxPayInfo(String prepay_id) {
7 String nonce = CommonUtil.create_nonce_str().replace("-", "");
8 String timeStamp = CommonUtil.create_timestamp();
9 //再算签名
10 String newPrepay_id = "prepay_id="+prepay_id;
11 String args = "appId="+Constants.appid
12 +"&nonceStr="+nonce
13 +"&package="+newPrepay_id
14 +"&signType=MD5"
15 +"&timeStamp="+timeStamp
16 +"&key="+key;
17 String paySign = SignUtil.getSign(args, "MD5");
18 WxPay wxPay = new WxPay();
19 wxPay.setNonce_str(nonce);
20 wxPay.setPaySign(paySign);
21 wxPay.setPrepay_id(newPrepay_id);
22 wxPay.setTimeStamp(timeStamp);
23 return wxPay;
24 }
25
注意:有些方法在前2篇中。
微信支付的最后一步:js调用
1 wx.chooseWXPay({
2 timestamp: json.timeStamp,
3 nonceStr: json.nonce_str,
4 package: json.prepay_id,
5 signType: 'MD5',
6 paySign: json.paySign,
7 success: function (res) {
8 alert("支付成功");
9 }
10 });
结束,微信支付全部结束啦,有问题可以留言找我哦,只会java的,88
来源:https://www.cnblogs.com/imeng/p/4810232.html