起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3970|回复: 12

[处理中3] 用户支付成功后却不执行成功后的代码

[复制链接]

10

主题

56

帖子

138

积分

初级会员

Rank: 2

积分
138
QQ
发表于 2017-6-12 10:00:16 | 显示全部楼层 |阅读模式
本帖最后由 chenyoucai 于 2017-6-12 10:14 编辑

有时用户支付成功后app前端会执行成功后的代码,但有时用户支付成功后app前端却不执行成功后的代码,支付宝和微信都会出现这个问题,而且这个问题发生的概率很大,急!!!!!!

用户支付成功后,到我们公司的微信或支付宝账户中看,确实收到用户的钱了,而且服务器也收到了微信和支付宝的异步通知了,所以我们判断用户确实是支付成功了。

我们的支付逻辑是:用户支付成功后,前端会发消息到服务器验证支付结果,验证成功后会返回付费内容给用户,但是发现后台没有收到验证消息,用户也没看到付费内容,所以判断是前端没有执行代码支付成功后的代码。

下面是代码:
微信的代码是:
                var tradeNo = justep.UUID.createUUID();//通常是交易流水号
                var notifyUrl = location.origin + "/baas/weixin/weixin/notify";
                var weixin = navigator.weixin;               
                weixin.generatePrepayId({
                        "body" : self.productname.get(),//支付显示名称
                        //mchId : "",//微信公众号的商户号,app内支付不需填写
                        "feeType" : "1",
                        "notifyUrl" : notifyUrl,//支付成功通知地址
                        "totalFee" : self.fee.get()*100,//总金额(单位分)
                        "traceId" : "DZJ",
                        "tradeNo" : tradeNo//订单号
                }, function(prepayId) {
                        weixin.sendPayReq(prepayId, function(message) {
                                var responseCode = parseInt(message);
                                if (responseCode === 0) {
                                        //支付成功后的代码
                                        ...


                                } else if (!isNaN(responseCode)) {
                                        //取消
                                        justep.Util.hint("微信取消支付");
                                } else {
                                        justep.Util.hint("微信支付失败!");
                                }
                        }, function(message) {
                                justep.Util.hint("微信支付失败!");
                        });
                }, function(message) {
                        justep.Util.hint("微信支付失败!");
                });


支付宝的代码是:
                var tradeNo = justep.UUID.createUUID();
                var notifyUrl = address.getAddress("payzhifubao");
                var alipay = navigator.alipay;
                var detail = self.productdetail.get();// 商品详情
                alipay.pay({
                        "seller" : "***我们的支付宝账号***", // 卖家支付宝账号或对应的支付宝唯一用户号
                        "subject" : self.productname.get(), // 商品名称
                        "body" : detail, // 商品详情
                        "price" : self.fee.get(), // 金额,单位为RMB
                        "tradeNo" : tradeNo, // 唯一订单号
                        "timeout" : "30m", // 超时设置
                        "notifyUrl" : notifyUrl
                }, // 服务器通知路径
                function(message) {
                        var responseCode = parseInt(message);
                        if (responseCode === 9000) {
                                //支付成功后的代码
                                        ...
        
                        } else if (!isNaN(responseCode)) {
                                //取消支付
                                justep.Util.hint("支付宝取消支付");
                        } else {
                                justep.Util.hint("支付宝支付失败");
                        }
                }, function(msg) {
                        justep.Util.hint("支付宝支付失败");
                });


请问是什么原因啊????急!!!!
谢谢!!!
补充:据用户反应,支付成功后没有看到付费内容,再支付一次,就能看到付费内容了。
同一个人、同一个手机,两次支付后却不一样,这怎么查啊??
发表于 2017-6-12 13:12:09 | 显示全部楼层
真正支付成功应该是通过后台判断的!
http://docs.wex5.com/wex5-server-question-list-2019/

后台判断支付成功后!主动给客户端推送一条消息!表示支持成功了!

js的成功回调不一定准确表示支付成功的!
引用网上一段话
http://www.oschina.net/question/2367368_243674
  1. 微信支付的回调分为两种,一个是支付后的js回调,根据结果需要我们自己判断跳转的页面(或提示操作)[根据官方文档描述:此处回调的结果不能作为支付成功/失败的凭证,所以这个地方的回调,我们可以称之为支付动作完成]。另外一个回调时服务器端回调,这个理解为服务器端的通知(准确的支付结果,具体支付成功/失败以此为准)
复制代码

qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

10

主题

56

帖子

138

积分

初级会员

Rank: 2

积分
138
QQ
 楼主| 发表于 2017-6-12 15:02:35 | 显示全部楼层
liangyongfei 发表于 2017-6-12 13:12
真正支付成功应该是通过后台判断的!
http://docs.wex5.com/wex5-server-question-list-2019/

支付是否成功,以后台收到的异步支付通知数据为准,这个我知道,我们也是这么做的。
不过我们是在用户支付后,前台先等待3秒,然后再由前台发送消息到后台获取准确的支付结果。

可能是我之前说的太多了,我再说的简单一点。
以我们的微信支付为例,下面是我微信支付成功后的回调函数:
function(message) {
        var responseCode = parseInt(message);
        if (responseCode === 0) {
                ..等待三秒,然后发送消息到后台获取准确的支付结果,然后根据准确的支付结果进行后续操作...

        } else if (!isNaN(responseCode)) {
                justep.Util.hint("微信取消支付");
        } else {
                justep.Util.hint("微信支付失败!");
        }
}


我们现在遇到的问题是:用户支付后,前台既没有发送消息到后台去获取准确的支付结果,也没有提示用户“微信取消支付”,也没有提示用户“微信支付失败”。
我们现在判断:用户支付后,前台没有执行支付成功回调函数代码。

回复 支持 反对

使用道具 举报

发表于 2017-6-12 16:40:43 | 显示全部楼层
chenyoucai 发表于 2017-6-12 15:02
支付是否成功,以后台收到的异步支付通知数据为准,这个我知道,我们也是这么做的。
不过我们是在用户支 ...

等待3秒也不一定 服务器就已经获取支付成功的通知了!
建议服务器获取推送消息以后!
再主动推送给客户端,支付成功的消息!

客户端不要主动请求服务器!  客户端是无法主动知道支付成功的!
你的代码是if else 执行的
如果
..等待三秒,然后发送消息到后台获取准确的支付结果,然后根据准确的支付结果进行后续操作...

这里代码执行了!那么下面的else肯定就不执行的了!
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

10

主题

56

帖子

138

积分

初级会员

Rank: 2

积分
138
QQ
 楼主| 发表于 2017-6-12 17:50:20 | 显示全部楼层
本帖最后由 chenyoucai 于 2017-6-12 18:10 编辑
liangyongfei 发表于 2017-6-12 16:40
等待3秒也不一定 服务器就已经获取支付成功的通知了!
建议服务器获取推送消息以后!
再主动推送给客户端 ...

      var responseCode = parseInt(message);
        if (responseCode === 0) {
        } else if (!isNaN(responseCode)) {
        } else {
        }

这种写法是参考的你们的例子,那responseCode === 0这个条件有什么用
或者我再问的具体一点,为什么上面的代码,有的时候有用,有的时候没用?????


回复 支持 反对

使用道具 举报

10

主题

56

帖子

138

积分

初级会员

Rank: 2

积分
138
QQ
 楼主| 发表于 2017-6-12 17:59:06 | 显示全部楼层
liangyongfei 发表于 2017-6-12 16:40
等待3秒也不一定 服务器就已经获取支付成功的通知了!
建议服务器获取推送消息以后!
再主动推送给客户端 ...

我知道if else的用法,我之所以说“我们现在遇到的问题是:用户支付后,前台既没有发送消息到后台去获取准确的支付结果,也没有提示用户“微信取消支付”,也没有提示用户“微信支付失败”。”,就是想告诉你,用户支付后前台一点反应也没有
回复 支持 反对

使用道具 举报

发表于 2017-6-12 18:21:23 | 显示全部楼层
chenyoucai 发表于 2017-6-12 17:59
我知道if else的用法,我之所以说“我们现在遇到的问题是:用户支付后,前台既没有发送消息到后台去获取 ...

一般情况!只要支付回调走了成功!你就直接提示用户支付成功吧!
大部分情况都不会错的!

可以根据前端js 回调事件提示用户!
真正数据校验的时候!要以后台为准!
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

10

主题

56

帖子

138

积分

初级会员

Rank: 2

积分
138
QQ
 楼主| 发表于 2017-6-25 23:01:40 | 显示全部楼层
本帖最后由 chenyoucai 于 2017-6-26 11:31 编辑
liangyongfei 发表于 2017-6-12 18:21
一般情况!只要支付回调走了成功!你就直接提示用户支付成功吧!
大部分情况都不会错的!

我现在测试的结果是支付成功后,没有走成功的回调函数,回调函数里面的代码根本就没执行。

我现在知道是什么原因了,以微信为例:
有的用户在用微信支付后,没有立刻点击微信支付完成页面右上角的“完成”按钮(低版本的微信是有这个“完成”按钮的),而是先去点击了微信发送过来的“支付凭证”通知,这就导致用户在支付后没有立刻返回到我的应用里,而是先进入到微信应用里了,进而导致没有执行支付回调函数success,此时即使用户再从微信应用返回到我的应用里,也不会触发success函数。


请你们根据我刚刚的描述测试一下,复现这个问题,看看能不能想个办法解决这个问题?


谢谢!


我的qq是262945558,如果在帖子里不方便交流,可以加qq聊。谢谢!
回复 支持 反对

使用道具 举报

发表于 2017-6-26 13:39:10 | 显示全部楼层
chenyoucai 发表于 2017-6-25 23:01
我现在测试的结果是支付成功后,没有走成功的回调函数,回调函数里面的代码根本就没执行。

我现在知道是 ...

如果没按 “完成”  按钮
就不会触发回调!
前台的回调只不过是给用提示而已!表示支付成功了!

既然微信有 :支付凭证”通知
也可以表示支付成功了!
前端只是个提示信息而已!并不是特别重要的!你不要在前端写重要的逻辑代码!
关于数据的操作代码都应该写在后端才对!
前端js回调只是给用户一个提示!用户知道支付成功就行了!
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

10

主题

56

帖子

138

积分

初级会员

Rank: 2

积分
138
QQ
 楼主| 发表于 2017-6-28 18:57:59 | 显示全部楼层
liangyongfei 发表于 2017-6-26 13:39
如果没按 “完成”  按钮
就不会触发回调!
前台的回调只不过是给用提示而已!表示支付成功了!

最近还有用户反映,新的微信版本,在支付后,按钮变成了“返回****”,但是用户点了这个按钮后,有时也不会触发回调,支付界面就跟没发生任何操作一样,给用户一种没有支付成功的感觉。
就想在成功的回调函数里面立刻给用户一个“支付成功”的提示,不进行其他任何操作,这个要求不过分吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-2 14:18 , Processed in 0.094515 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表