一、调用微信的JS文件

1.首先要绑定【JS接口安全域名】,“公众号设置”的“功能设置”中

2.引入JS文件

 备注:支持使用 AMD/CMD 标准模块加载方法加载

 <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

3.通过config接口注入权限验证配置

 wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,这里只写支付的
});

4.通过ready接口处理成功验证

 wx.ready(function(){
wx.hideOptionMenu();//隐藏右边的一些菜单
});

二、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

   public static Token getToken(String appid, String appsecret) {
Token token = null;
String requestUrl = Constants.token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
// 发起GET请求获取凭证
JSONObject jsonObject = CommonUtil.httpsRequestToJsonObject(requestUrl, "GET", null); if (null != jsonObject) {
try {
token = new Token();
token.setAccessToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInt("expires_in"));
} catch (JSONException e) {
token = null;
// 获取token失败
log.error("获取token失败 "+jsonObject.getInt("errcode")+","+jsonObject.getString("errmsg"));
}
}
return token;
}

有些方法在前两篇中。

3.获取jsapi_ticket

   public static Ticket getTicket() {
//Constants.ticket_url = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
String requestUrl = Constants.ticket_url.replace("ACCESS_TOKEN", TokenThread.accessToken.getAccessToken());
// 发起GET请求获取凭证
JSONObject jsonObject = CommonUtil.httpsRequestToJsonObject(requestUrl, "GET", null);
Ticket ticket = null;
String jsapi_ticket = "";
int expires_in = 0;
if (null != jsonObject) {
try {
jsapi_ticket = jsonObject.getString("ticket");
expires_in = jsonObject.getInt("expires_in");
ticket = new Ticket();
ticket.setTicket(jsapi_ticket);
ticket.setExpiresIn(expires_in);
} catch (JSONException e) {
// 获取失败
log.error("获取jsapi_ticket失败"+jsonObject.getInt("errcode")+","+jsonObject.getString("errmsg"));
}
}
return ticket;
}

注意:jsapi_ticket和access token为7200的有效时间。7200后要重新获取,我是放在线程里面死循环的。

4.算签名

 /**
* 签名实体类
* @author rory.wu
*
*/
public class Signature implements Serializable {
private static final long serialVersionUID = -7799030247222127708L; private String url;
private String jsapi_ticket;
private String nonceStr;
private String timestamp;
private String signature; //下面是getset方法
}
    /**
* 算出签名
* @param jsapi_ticket
* @param url 业务中调用微信js的地址
* @return
*/
public static Signature sign(String jsapi_ticket, String url) {
String nonce_str = CommonUtil.create_nonce_str();
String timestamp = CommonUtil.create_timestamp();
String string1;
String signature = ""; //注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"&timestamp=" + timestamp +
"&url=" + url;
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = CommonUtil.byteToStr(crypt.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
} Signature result = new Signature();
result.setUrl(url);
result.setJsapi_ticket(jsapi_ticket);
result.setNonceStr(nonce_str);
result.setTimestamp(timestamp);
result.setSignature(signature); return result;
}

注意:有些方法在前两篇中

这样就算出签名了。

5.传递到前端页面

把随机字符串:nonce_str,timestamp时间戳,appId,签名,包装为prepay_id=prepay_id的预支付ID传递到前端。

 wx.config({
appId: '${appId}', // 必填,公众号的唯一标识
timestamp: ${timestamp}, // 必填,生成签名的时间戳
nonceStr: '${nonceStr}', // 必填,生成签名的随机串
signature: '${signature}',// 必填,签名,见附录1
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

6.现在就可以使用微信JS了。

三、调用微信支付

在前一篇中已经获取到了预支付订单的ID,prepay_id,

 /**
* 微信支付对象
* @author rory.wu
*
*/
public class WxPay implements Serializable {
private static final long serialVersionUID = 3843862351717555525L;
private String paySign;
private String prepay_id;
private String nonce_str;
private String timeStamp; //get,set方法
}
    /**
* 获取页面上weixin支付JS所需的参数
* @param map
* @return
*/
private WxPay getWxPayInfo(String prepay_id) {
String nonce = CommonUtil.create_nonce_str().replace("-", "");
String timeStamp = CommonUtil.create_timestamp();
//再算签名
String newPrepay_id = "prepay_id="+prepay_id;
String args = "appId="+Constants.appid
+"&nonceStr="+nonce
+"&package="+newPrepay_id
+"&signType=MD5"
+"&timeStamp="+timeStamp
+"&key="+key;
String paySign = SignUtil.getSign(args, "MD5");
WxPay wxPay = new WxPay();
wxPay.setNonce_str(nonce);
wxPay.setPaySign(paySign);
wxPay.setPrepay_id(newPrepay_id);
wxPay.setTimeStamp(timeStamp);
return wxPay;
}

注意:有些方法在前2篇中。

微信支付的最后一步:js调用

 wx.chooseWXPay({
timestamp: json.timeStamp,
nonceStr: json.nonce_str,
package: json.prepay_id,
signType: 'MD5',
paySign: json.paySign,
success: function (res) {
alert("支付成功");
}
});

结束,微信支付全部结束啦,有问题可以留言找我哦,只会java的,88

微信公众号支付(三):页面调用微信支付JS并完成支付的更多相关文章

  1. 微信公众号对接JS-SDK接口 调用微信内置地图

    微信js-sdk开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 1.页面配置 引用微信js- ...

  2. Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装

    在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...

  3. appium操作微信公众号H5 web页面

    安卓微信公众号的H5页面是webview,一般操作需要切换context. 在执行如下步骤,就能直接像识别native样识别webview 1.代码追加: ChromeOptions options ...

  4. Java开发微信公众号(一)---初识微信公众号以及环境搭建

    ps:1.开发语言使用Java springMvc+Mybaits+spring maven实现 2.使用微信接口测试账号进行本地测试 https://mp.weixin.qq.com/debug/c ...

  5. NodeJs 开发微信公众号(三)微信事件交互

    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...

  6. 三星note4,微信公众号开发,页面闪退

    在做微信公众号开发时,使用三星note4测试,有一个select框闪退的问题出现. 出现该问题的原因是该选择框,设置了appearance:none;属性.查找了官方解释是: 所有主流浏览器都不支持 ...

  7. .NET微信公众号开发-1.0初始微信公众号

    一.前言 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一 种主流的线上 ...

  8. 3.微信公众号开发:配置与微信公众平台服务器交互的URL接口地址

    微信开发基本原理: 1.首先有3个对象 分别是微信用户端 微信公众平台服务器 开发者服务器(也就是放自己代码的服务器) 三者间互相交互 2.微信公众平台服务器 充当中间者角色 (以被动回复消息为例) ...

  9. 微信公众号开发--.Net Core实现微信消息加解密

    1:准备工作 进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2:基本配置 设置为安全模式 3.代码实现 ...

  10. 玩玩微信公众号Java版之六:微信网页授权

    我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧!   参考官方文档:https://mp.weixin.qq.com/wiki?t=resource ...

随机推荐

  1. bzoj2527

    首先环可以变成链来处理,对于l>r的情况就是修改区间[1,r],[l,mx]然后不难想到整体二分,二分答案k,然后算1~k场流星雨对国家的贡献然后判定将国家划分变成子问题解决,没什么难的终于不是 ...

  2. Ubuntu Builder —— 一个制作自己的发行版的工具

    Ubuntu Builder 是一个使用起来很简单的用来构建基于 Ubunut 的自己的发行版的工具. 你可以下载最新的 Ubuntu Builder 的 DEB 安装包.下载和安装请前往:http: ...

  3. POJ 2513 Colored Sticks 解题报告

    第一次接触欧拉回路.虽然在离散数学里学过,敲代码还是第一次. 本题是说端点颜色相同的两根木棒可连接,能否将所有的木棒连成一条直线. 将颜色视为节点v,将木棒视为边e,构成图G.如果能找到一条一笔画的路 ...

  4. SharePoint 2010 部署 WSP 包

    转:http://www.cnblogs.com/myheaven/archive/2011/05/19/2051180.html .net在工程的下面生成了WSP包,在Debug下面.需要放到生产环 ...

  5. ASP.NET MVC3学习心得-----表单和HTML辅助方法

    5.1表单的使用 5.1.1  action和method的特性 表单是包含输入元素的容器,包含按钮.复选框.文本框等元素,表单的这些输入元素使得用户能够向页面中输入信息,并把输入信息提交给服务器.A ...

  6. Android 再按一次退出程序

    实现代码: private long exitTime = 0; /** * 捕捉返回事件按钮 * * 因为此 Activity 继承 TabActivity 用 onKeyDown 无响应,所以改用 ...

  7. Add controls dynamically in flowlayoutpanel

    For a FlowLayoutPanel, you don't need to specify a location since the controls are arranged for you. ...

  8. LoadRunner 参数化详解

    可能稍微对LR 有些了解的人都知道LR 参数化的功能,今天请跟我来一起好好理一下. 首先,咱们先说一下为啥要用参数化?假如您录制了一个登录的脚本,如下所示, web_submit_form(" ...

  9. Java语言使用HttpClient模拟浏览器登录

    使用HttpClient来模拟浏览器登录网站,然后可以进行操作,比如发布信息等 第一步:获取实际的post网址,(不考虑复杂情况下) 1.需要使用到firefox的httpfox插件,httpfox中 ...

  10. MySQL开发中常用的查询语句总结

    1.查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>, ...