JS-SDK微信支付开发攻略

这篇具有很好参考价值的文章主要介绍了JS-SDK微信支付开发攻略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

  一、吐槽篇

  一个字——坑!两个字——很坑!三个字——非常坑!首先,微信支付接口作为微信开发接口的一部分,竟然有一本书那么厚的官方文档,共36页,更重要的是,这36页还不能把开发的流程说清楚,描述过于分散,过度分类,导致遇到一个问题的时候很难定位,虽然文档前面给了时序图,但是开发流程的时序化仍然不够,让人觉得十分混乱。本来接手这个任务的时候时间就非常的紧,想着找个demo撑死一两天就完事了,没想到最终耗费了接近一个星期,除去中间别的事耽误的时间也用了整整五天的时间,在网上查找资料的时候也看到很多人说一个问题卡好几天甚至几周的情况,实在是难以接受。

  二、开发流程

  我这里就一并按顺序总结了。首先我用的是JS-SDK,即官方文档所描述的方式去做,必须说明的是,虽然是JS-SDK,但是整个签名过程不可能只在JS里完成,由于安全性问题,微信提供的接口JS是无法跨域调用的,必须在后台进行调用再将结果发给前台。OK,我的开发的宏观情况是,前端使用JS-SDK,后端使用JAVA tomcat。

  总体流程是:①授权部分:后端通过微信接口拿到access_token,再拿到ticket(jsapi_ticket),给前台,前台通过js-sdk将jsapi_ticket,noncestr,timestamp,url签名,获取授权。

        ②支付部分:前端获取code,给后端,后端通过code访问微信接口拿到openid,通过openid等一堆key信息和回调url拿到prepayid,把prepayid,timestamp,noncestr给前台,前台通把这些东西以及签名提交,发起支付。

        ③回调部分:支付成功后,支付部分填写的url的对应方法会执行,拿到后从参数中拿到支付成功后的信息,校验签名,发送成功结果给支付发起端。

        ④完成部分:前端收到成功的消息,自定义跳转页面。

  1、授权部分

  js部分:

  wx.config({

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

这是发起授权申请的部分,signature需要签名的字段包括:
 "jsapi_ticket="+ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;

说明:
①jsapi_ticket获取:
需要调用接口获取,调用接口不能用js(跨域),所以在后台进行,接口调用使用https://api.weixin.qq.com/cgi-bin/ticket/getticket,GET方法即可,参数是"access_token="+access_token +"&type=JSAPI"
access_token获取:
调用https://api.weixin.qq.com/cgi-bin/token,同样使用GET方法,参数是"appid="+appid+"&secret="+secret+"&grant_type=client_credential",只要参数不错,就能拿到jsapi_ticket了。
(后面获取opendid的时候也会拿到一个
access_token,但不是同一个!)
③nonceStr、timestamp在JS生成即可,记得签名时候的timestamp和nonceStr要和参数填写的一样。
④签名规则:
就是在上面那一串东西后面加上"&key=xxxx",然后MD5加密处理后,变成大写,key是商户的key,千万别搞错了,不是appkey。规则具体看这里
⑤appId,这里I是大写的
⑥url的获取:
这个url不需要urlencode,但是必须是当前发起支付页的url,若url中有#号,只取#前面的。下面代码直接拿走吧!
location.href.split("#")[0]

⑦invalid signature:如⑥所说,url输入的不对,url要动态获取

⑧invalid url domain :url和appid没绑定,要在微信公众号那里的功能配置里配置,别把安全域名和业务域名搞混了……(我就在这里卡了半天)


配置成功后,就会进入
wx.ready(function(){
}
这个函数里面,并且如果debug打开,能看到configok的反馈。

  2、支付部分
为了确保wx.config成功后再支付(否则不可能支付),请把下面函数放到wx.ready里面:
wx.chooseWXPay({
    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    nonceStr: '', // 支付签名随机串,不长于 32 位
    package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
    paySign: '', // 支付签名
    success: function (res) {
        // 支付成功后的回调函数
    }
});
首先说明填写要怎么填,别的应该都好理解,package这个东西有点不明所以,这个东西官方文档叫做扩展包,但是在整个官方文档里却又找不到扩展包要填什么,只知道肯定要填"package=prepay_id=xxxx",我翻查了旧版微信支付的demo等,知道了这个扩展包主要是填写一些选填的东西,例如币种、编码等,但这并不是必须的,用最简单的"package=prepay_id=xxxx"填写就可以了。
先给出要签名的字符串列表
String signstr = "appid="+appid+"&body="+body+"&mch_id="+mch_id+"&nonce_str="+nonce_str+"&notify_url="+ notify_url +"&openid="+openid+"&out_trade_no="+out_trade_no+"&spbill_create_ip="+spbill_create_ip+"&total_fee="+total_fee+"&trade_type=JSAPI"+"&key="+appkey;

说明

①签名必须在后端完成,前端timestamp和nonceStr必须和后端签名时用的值一致。

②notify_url不需要urlencode,回调地址最好不要加参数(回调地址是支付成功后通知的那个地址接口,接口内容自己完成)

③openid的获取:

可以看官方文档,这些文档都不是一个文档,所以很容易找不到。

具体做法:

首先,在客户端点击支付后,必须先跳转到这个地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

1)redirect_uri,是你使用JS-SDK的页面的地址,也就是wx.chooseWXPay所在页面的地址,必须进行urlencode,跳转过去后能在url中尾部看到?code=CODE&state=STATE,把CODE从url中取出来。
2)使用GET方法调用这个接口https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code,把刚取到的code填进去,还有别的参数不要填错了。
3) 返回的json格式中就能取到openid了。

④prepayid的获取:
这部分仍然在后台进行,使用post并且是XML格式
发送数据,也就是说发送一段XML格式的字符串就是了,格式如下:
         String text = "<xml>"+
        "<appid>"+appid+"</appid>"+
         "<body>"+body+"</body>"+
         "<mch_id>"+mch_id+"</mch_id>"+
        " <nonce_str>"+nonce_str+"</nonce_str>"+
        " <notify_url>"+notify_url+"</notify_url>"+
         "<openid>"+openid+"</openid>"+
         "<out_trade_no>"+out_trade_no+"</out_trade_no>"+
         "<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>"+
         "<total_fee>"+total_fee+"</total_fee>"+
         "<trade_type>"+"JSAPI"+"</trade_type>"+
         "<sign>"+sign+"</sign>"+
      "</xml>";

说明:

1)spbill_create_ip是支付终端的IP地址

2)notify_url不用urlencode

3)total_fee不能是小数,因为单位是分

4)签名上面已经给了,就是用key,value方式把除了sign以外的所有字符串连起来,最后加上"&key=xxx",然后MD5再转大写。

5)out_trade_no,这个是自己标记自己商品号的一个号,不能重复,所以建议用时间戳+一些自己的规则。

6)body是中文时报签名错误:首先确保中文是utf-8,然后转成iso8859-1,可以用下面这句代码:

text = new String(text.getBytes(), "iso8859-1");

注意:①假如是自己在本地调用接口,写死一个中文去测试,请确保你的页面编码是utf-8,像我这种不太注意的,本来页面用了GBK编码,所以怎么试都不成功,怎么查编辑文件用什么编码,自行谷歌百度自己的编辑器的设置编码在哪里。

     ②tomcat的编码,如果是从ajax把中文的body传到后台,请注意tomcat的编码设置,确保拿到的中文是utf-8。

7)上面的做好了,就可以拿到prepayid了,将prepayid和自己生成的nocestr和timestamp以及刚才生成的签名sign传回给前台,并且填到wx.chooseWXPay里,尝试支付。

8)“商户签名错误”:假如已经拿验算工具查过,签名是正确的,仍然报错,那必然是这个原因——timeStamp,S是大写的!!。虽然官网已经做出了提醒,但是绕了那么多圈之后你早就不记得这件事了,或者说没搞清楚,没错,签名的时候timeStamp的S必须是大写的,然后前台的wx.chooseWXPay里的timestamp是小写的,就是那么的神奇!

9)当前的页面URL未注册:

微信公众账户里的微信支付-支付测试,看看填写的地址是不是支付所在的地址。

10)系统繁忙,正在升级,请稍后再试:

基本上不会是系统繁忙,这是我整个过程遇到微信接口唯一的一次报错错误,请检查签名参数,着重检查中文编码问题。

 


3、支付部分
终于,突过重重难关,弹出支付图标并且可以支付了,但是怪并没有打完,你的回调接口可能还没完善,这篇文章对回调部分的描述挺不错的,网上能下到JAVA的DEMO,但有些部分已经不能用了,主要不能用的部分是拿到数据的时候需要用inputstream去处理,而不能通过request直接读取。
回调要要做的事:
①拿到反馈数据
只要支付成功了,微信会推送一个XML格式的数据过来,JAVA请用下面的代码解析出来
public static byte[] readBytes(InputStream in) throws IOException {  
        byte[] temp = new byte[in.available()];  
        byte[] result = new byte[0];  
        int size = 0;  
        while ((size = in.read(temp)) != -1) {  
            byte[] readBytes = new byte[size];  
            System.arraycopy(temp, 0, readBytes, 0, size);  
            result = SystemUtil.mergeArray(result,readBytes);  
        }  
        return result;  
    }  

②校验签名

微信支付传过来数据,但未必是对的,所以把里面的签名拿出来,把别的变量拿出用keyvalue同样的方式加密再和签名对比,一样的就是对的。

③返回SUCCESS

④微信会在30分钟内进行8次回调,这是担心你网络问题等拿不到支付后的数据,所以你要判断这个东西是否已经成功处理过了

⑤处理:不外乎就是拿出订单号等,写入自己的数据库里。


4、完成部分

wx.chooseWXPay({
    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    nonceStr: '', // 支付签名随机串,不长于 32 位
    package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
    paySign: '', // 支付签名
    success: function (res) {
        // 支付成功后的回调函数
    }
});
看到“支付成功后的回调函数”了吗?就在这里面写完成后跳转的页面,location.href=xxx,完结了~

 文章来源地址https://www.toymoban.com/news/detail-711201.html

大功告成……唉,真不好意思说大功,像支付宝一样的话也就一天半天的事,这个却整了那么久。

给官方的建议是,Demo能否出现在显眼的位置,能否做一个针对DEMO的文档或者说明(例如这个demo是适合哪个版本的都没说),对DEMO做相应修改或者填写各种key和id就行了,顶多再教一下配置些什么,毕竟很多东西都是死的,不需要用户全部敲一遍,只不过按照规则填就是了。

到了这里,关于JS-SDK微信支付开发攻略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • h5接微信js-sdk的详细步骤

    流程图: 微信文档https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 登录微信公众平台公众号设置,进行js安全域名设置 配置完安全域名之后,会让微信知道我们有这样一个域名,但是此时还不能实现双方对话 1.申请一个安全域名 2.去微信公众平台下载MP_verify_WCdi1jnSEaG

    2024年02月04日
    浏览(45)
  • 生活随笔-吐槽篇

    😘个人主页:@曲终酣兴晚^R的小书屋🥱 😕作者介绍:一个莽莽撞撞的🐻 💖专栏介绍:日常生活往事回忆 😶‍🌫️每日金句:被人暖一下就高热,被人冷一下就成冰,请原谅我一生爱憎分明. 本专栏的每篇不求刻意📖,不求刻意👍,😍就好. 每个人的人生大抵都不一样

    2024年02月09日
    浏览(74)
  • vue3引入JS-SDK实现h5分享小卡片、跳转微信小程序功能

    微信js-sdk官方文档: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 想要实现的效果: 1.登录微信公众平台,进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 2.通过npm引入js-sdk 安装成功后,可以在package.json中找到\\\"weixin-js-sdk\\\" 3.在main.js中,将js-sdk挂载

    2024年02月11日
    浏览(62)
  • feat:使用企业微信JS-SDK的onMenuShareAppMessage()实现点击转发自定义分享内容(TypeScript)

    背景:企业微信应用使用企业微信JS-SDK的分享接口实现分享样式自定义 原生: 需要实现成: 企业微信JS-SDK 是企业微信面向网页开发者提供的 基于企业微信内 的网页开发工具包。 通过使用企业微信JS-SDK,网页开发者 可借助企业微信 高效地使用拍照、选图、语音、位置等手

    2024年02月07日
    浏览(41)
  • 微信分享第三方连接(H5页面)自定义缩略图、标题、描述(显示分享框,而不是链接)(微信JS-SDK)

    首先要说明几个分享相关的问题: 现在微信不支持自定义按钮分享组件(也就是说不能点击某个按钮分享),只能通过微信右上角的三个小点,点击后选择分享给朋友,朋友圈等。 当前从企业微信分享到微信好友和微信朋友圈是有问题的,一些手机(有些是因为app版本,企

    2024年02月09日
    浏览(52)
  • H5项目中使用微信JS-SDK(以H5项目批量上传图片为例,兼容IOS及安卓)

    H5项目中使用微信图片上传相关sdk,主要用于解决 1.安卓手机无法一次选择多张图片进行上传问题;2.控制IOS系统手机一次可无限量选择图片上传的问题 一、准备工作:公众号配置 验证所需使用的sdk是否符合需求 可在使用场景中,打开微信官方提供的 微信SDKDemo 链接,或企业

    2024年02月07日
    浏览(48)
  • 微信 JS-SDK 实现自定义分享、手机选图拍照、图片音频处理、地理位置、摇一摇等功能

    微信 JS-SDK 是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包 通过使用微信 JS-SDK ,开发者可借助微信高效地使用 拍照 、 选图 、 语音 、 位置 等手机系统的能力 同时可以直接使用 微信分享 、 扫一扫 、 卡券 、 支付 等微信特有的能力,是管理微信一切

    2024年02月09日
    浏览(44)
  • 微信公众号 H5 JS-SDK wx.config 报错 invalid url domain 及 invalid signature 错误原因及解决方式

    在项目进行JSSDK使用的过程中,出现了很多问题,其中报错invalid url domain 以及 invalid signature最多,也最头疼,部分坑在文档里也并没有写清楚,这里就简单说下这两个报错的原因和解决方式 当报错invalid url domain时 其实离成功不远了,错误原因也很直白,就是url并没有在公众

    2024年02月08日
    浏览(40)
  • 无条件抽奖和条件抽奖(互动功能发起端JS-SDK)

    允许开始前对抽奖进行奖品、中奖人数、中奖人员等设置,完成设置后可以开始抽奖。 本功能只支持讲师、嘉宾、助教、管理员这四种角色进行抽奖的发起和停止。 支持自定义设置中奖用户信息采集字段。 支持设置预设中奖用户。 支持设置定时开奖 可查看中奖名单     在

    2024年02月08日
    浏览(36)
  • 微信支付V3-SDK(已发布npm)

    暂时对接了部分使用频率比较高的接口,如果在使用中发现问题,可 📮wx.open@qq.com 邮箱联系我 属性 描述 指引 appId 应用ID 🌈 直达链接 mchId 商户号ID 🌈 直达链接 apiKeyV3 API_v3密钥 🌈 直达链接 serialNo API证书序列号 🌈 官方教程 privateKey API证书私钥 🌈 官方教程 publicKey API证

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包