latrell / Alipay

支付宝SDK在Laravel5的封装。
408 stars 91 forks source link

APP无法接收异步通知问题 #7

Closed frozencandy closed 8 years ago

frozencandy commented 8 years ago

手机可以支付且手机能收到支付成功通知,但是服务器无法收到异步通知 将加密后的拼接字串进行urldecode发现"&notify_url"被转为了"¬ify_url"

我把你的代码拷贝出来 将加密后得到sign的参数数组中的notify_url删除,并拼接成url参数字串 因为notify_url不是数组第一个,此时使用createLinkstringUrlencode拼接就会有&notify_url 然后再用notify_url=url_encode(http://xxxx) . '&' . 刚拼接的url参数字串 生成订单,服务器就收到异步通知了 不知是不是我个人问题,所以不知是不是bug

latrell commented 8 years ago

&not 直接输出,是会变成 ¬ 的,因为它跟   一样,是HTML预定义字符。 根据你的描述,我无法定位问题,能更详细一点吗?比如提供可以重现的例子。

frozencandy commented 8 years ago

情况和个人解决步骤如下: 1 安装该sdk,配置 2 app('alipay.mobile')生成支付字串、将字串交给ios/安卓 3 ios/安卓支付成功,手机收到成功消息,但服务器一直没收到,接口没有被调用迹象 4 手动调用接口,查看路由配置,无发现问题,能正常记录接口访问日志 5 将生成的支付字串进行urldecode,发现 input_charset=utf-8&notify_url=http 被转成了 _input_charset=utf-8¬ify_url=http 6 怀疑是此问题,将 return $this->createLinkstringUrlencode($para); 改为 unset($para['notify_url']); return 'notify_url=' . urlencode($this->notify_url) . '&' . $this->createLinkstringUrlencode($para); 7 重新生成支付字串,将字串交给ios/安卓 8 支付,成功收到通知

不知是不是我这里个人的个别现象

latrell commented 8 years ago

第5点,将生成的支付字串进行urldecode后,你是如何打印出来的呢,因为浏览器会将&not显示为¬,如果你是直接在页面上看打印结果,确实是会这样,右键页面查看源代码,是否也是如此呢?

IvanJobs commented 8 years ago

没有太深入的研究你说的这个过程,但是以前开发过程中确实遇到过类似的情况,不过是在PC Web端,当时也发现了异常的编码字符。最终找到的原因是:异常的编码字符没有什么问题,本身就是这样,只不过在不同模式下显示的不一样而已,实际传输的还是那个编码,接受不到通知是因为配置的通知URL没有加http前缀。 希望对你有所帮助,上面是我的个人经验。

latrell commented 8 years ago

没有带 http 前缀确实是一个坑。