微信公众号开发中遇到的问题——支付回调,分享,获取openId(三)

2024-08-28 07:08

本文主要是介绍微信公众号开发中遇到的问题——支付回调,分享,获取openId(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微信的统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder)中,下单时,有这样一个参数:notify_url,该参数是为接收微信支付异步通知回调的地址,通知url必须为直接可访问的url,不能携带参数。之前我做回调的时候,为了性能方面的考虑,没有使用这种方式,而是在这个方法中:

wx.ready(function(){wx.chooseWXPay({"timestamp": timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符"nonceStr": nonceStr, // 支付签名随机串,不长于 32 位"package": 'prepay_id=' + prepayId, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)"signType": 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'"paySign": paySign, // 支付签名success: function (res) {//支付成功},cancel:function(res){//支付取消},fail:function(res){//支付失败}});
});

当success、cancel、fail的时候,用ajax直接调用后台做回调操作,这样做的好处是不用在点击支付的时候做操作订单等一系列操作,提高了支付弹出框弹出的速度;但是后来测试的时候,发现用户支付完成之后,如果没有点击微信支付成功页面右上角的完成按钮时,就回调不到success中的回调方法。那这样问题就很大了,所以我只能修改成在notify_url中做回调操作,但是调用这个方法的时候,不能携带参数,那就不知道是哪个订单做的回调。我是这样解决的,下单接口中有个attach参数,我把订单的id放入到了这个参数中,回调时会原样返回来,不知道有没有其他方法没有,欢迎大家提供方法。

2、微信分享
a)
在需要被分享的页面,引入js:<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript"></script>
b)
准备微信Jssdk的基本配置信息:

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

c)
准备好参数之后调用相关分享的方法:

wx.ready(function(){//分享到聊天wx.onMenuShareAppMessage({title: shareTitle, // 分享标题desc: shareDesc, // 分享描述imgUrl: shareImg,//分享图片success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});//分享到QQwx.onMenuShareQQ({title: shareTitle, // 分享标题desc: shareDesc, // 分享描述imgUrl: shareImg,//分享图片success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});//分享到微博wx.onMenuShareWeibo({title: shareTitle, // 分享标题desc: shareDesc, // 分享描述imgUrl: shareImg,//分享图片success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});//分享到qq空间wx.onMenuShareQZone({title: shareTitle, // 分享标题desc: shareDesc, // 分享描述imgUrl: shareImg,//分享图片success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});//分享到朋友圈wx.onMenuShareTimeline({title: shareTitle, // 分享标题desc: shareDesc, // 分享描述imgUrl: shareImg,//分享图片success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});
});

d)
在wx.config中,timestamp、nonceStr、signature三个参数强烈建议用ajax动态获取,如果不是动态获取的首次分享可能没有问题,但是当被分享人打开这个页面再次分享时就会出现问题,这个一定要注意。

var timestamp;
var nonceStr;
var signature;
//这里要特别强调这个url,获取signature时提供的url,一定要用这种方法,
//encodeURIComponent类似于java中的URIEncoding.encode方法,因为当url中有传递的参数时,如果不加密就会报错
var url = encodeURIComponent(location.href.split('#')[0]);
$.ajax({type: "POST",async: false,url: "${pageContext.request.contextPath }/course/getJsSdk.action",data:"url="+url,success: function(msg){var msgArr = msg.split("##");timestamp = msgArr[0];nonceStr = msgArr[1];signature = msgArr[2];},error: function(msg){alert("数据错误!");}
});

getJsSdk方法:

/*** 获取JsSdk的信息* @throws Exception*/
@Action("getJsSdk")
public void getJsSdk() throws Exception{String url = request.getParameter("url");log.info("url = " + url);String ticket = AdvancedUtil.getTicket(WSPostUtil.getToken());jssdk = JsSdkUtil.getSignature(ticket,url);printInfo(jssdk.getTimestamp() + "##" + jssdk.getNoncestr() + "##" + jssdk.getSignature());
}

这个方法中用到的相关方法,我在上篇博客中已经有提到,如果有疑问的,可以给我留言,谢谢。

3、获取openId(用户没有关注公众号)

如果要获取openid,可以在页面中把链接地址中把链接写成这种形式:
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=&redirect_uri=http%3A%2F%2Fwww.XXX.com%2Ftest.action&response_type=code&scope=snsapi_base&state=state#wechat_redirect">获取openId</a>,其中把appid换成自己公众号的appid,然后在test方法中,通过获取到的code来获取openId。scope=snsapi_base当把scope参数设置成snsapi_base时,也就只能获取到openId;如果要想获取用户的基本信息,要把scope设置成snsapi_userinfo,在用户没有关注公众号的时候,通过用户授权来获取用户信息。


这篇关于微信公众号开发中遇到的问题——支付回调,分享,获取openId(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114075

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +