#
###遇到的问题:
发现客户在前台通过支付宝充值成功了,而且数据库也有了充值成功记录,并且充值状态是成功的,但是该用户的积分数值没有改变,我自己测试的时候是没有问题的,事后我通过后台的补充充值也能给他充值成功,后台和前台是同样的dao,mng层,想不通是为什么没有能够充值成功。
###目前解决的办法:
经排查,支付宝的充值功能接口分为同步和异步两种方式,我只实现了同步充值的接口,而异步充值的接口没有具体实现,导致我自己测试时可以充值成功,而客户则是有些人可以充值成功,有些人却无法充值成功。
经检查,因为对代码理解不够透彻,我的同步充值的实现复杂化了,在同步充值的时候,我调用了查询充值是否成功的接口,其实是不需要的,支付宝接口在预创建账单时传入了参数值,可以直接在同步充值时获取到,通过预创建菜单时得到的参数值进行相关业务逻辑的编写。
异步充值的原理是,支付宝相关接口有可能不走同步执行的逻辑转而走异步执行逻辑代码,异步执行其实就是,支付宝不用你自己回调函数,而是支付宝服务器给你发送一个异步post请求,里面携带相关的参数,包括安全验证的参数,服务器获得post请求后异步执行相关的充值业务,从而减小服务器压力,提高效率。
我进行充值的业务逻辑是,预创建账单时在js_userscore_pay表插入一条记录,记录相关的充值信息,充值状态status记录为false,在支付成功调用同步或者异步充值时(我一开始没写异步充值业务代码),再修改充值状态status为true,然后在js_userscore积分表增加充值的积分。
但后来发现一个问题,我充值记录的status状态码发生了改变,变为true了,但是我积分表的积分数值没有增加,状态码和积分数值的增加是在同步或者异步充值的回调函数的实现的,不应该只改变了状态码,而积分数值没有变化。
两种可能,一种是同步回调函数只执行了一半,然后就执行了异步充值逻辑,而异步充
值我没有实现业务代码,所以充值失败了;还有一种可能,更新账户余额的行为没有执行,数据库rollback了。
后期经过修改,添加和修改了异步,同步执行逻辑代码,执行同步代码块充值可以成功,但是异步充值失败,经检查发现,异步充值权限校验不通过,但是同步检验通过。
目前暂时的做法是,不做权限检验,来请求获取参数,根据参数进行充值,后期再进行修改