更新记录
1.0.0(2019-07-01)
插件简介
专门用来修复苹果IOS支付时出现"您已购买此App内购买项目。此项目将免费恢复"。
问题描述
首先在IOS平台里面创建“APP内购买项目”,选择的是“消耗型项目”,然后用uni-app官方的支付api进行支付,多支付几次,有时候就会出现提示“您已购买此App内购买项目。此项目将免费恢复”, 特别是在沙盒测试里面支付很大几率出现,我明明选的是消耗型项目,应该每一次都是新的支付,不存在恢复的情况,而且出现这种情况后,后面再怎样支付都是提示这个信息,有时候连删除掉应用, 重新再安装,也是一样的提示,这个对于需要消耗型项目支付的人来说问题太严重了,苹果支付完全没法用,苹果对虚拟产品又不给微信和支付宝进行支付,项目就一直卡在这上面了。
问题原因
上网搜了一圈,发现遇到的人不少,原因是苹果的服务器对大陆访问很慢(特别在沙盒测试环境更加不好),导致用户在购买成功后,收不到苹果的IAP支付成功通知,交易就会一直卡在那里,没有关闭掉,后面无论怎样支付都是提示 “您已购买此App内购买项目。此项目将免费恢复”。
解决问题
找到原因,就开始找补救方法了,补救方法就是需要把上一次未完成的订单结束掉,下一次就可以正常支付了.本插件就是在做这件事。
代码说明
在JS里面引入插件
var zdIospay = uni.requireNativePlugin('ZD-Iospay');
使用说明
var transactionDateresult=zdIospay.ZdIospayFunctionSync('对应苹果里的productid');
var transactionDate = eval("("+transactionDateresult+")");
调用时只需一个参数,就是你苹果里面自己配的消耗型内购项目的productid,程序会找到这个productid对应的订单,如果发现有未结束的订单,自动帮你结束掉。
返回值说明
当没有未结束的订单时,返回
{
"result": "0"
}
当查询到有未结束的订单,返回
{
"result": "0",
"transactionIdentifier": "1000000538781786",
"transactionReceipt": "苹果交易收据",
"transactionState": "1",
}
参数 | 值 |
---|---|
result | 只会返回0,代表插件调用成功 |
transactionIdentifier | 苹果交易订单号 |
transactionReceipt | 苹果交易数据,可以把数据发送到苹果的服务器进行验证真假 |
transactionState | "1"为交易成功,没有其它值,因为只有交易成功,又收不到苹果IAP通知才会卡住,失败订单会自动结束的. |
注:
- 如果查询到有未结束的订单,程序会自动结束掉,并且返回苹果的订单数据,这个数据只会返回一次,下一次再调用因为订单已经结束掉了,所以不会查询到数据了。 这时如果你调自己的服务器失败了,苹果的订单数据就丢了,建议自己可以先缓存在本地,等你调用自己的服务器成功后,再删除掉。
- 插件的返回值是字符串类型,而不是JSON类型,如果需要变成JSON类型需要调用eval("("+transactionDateresult+")")转换成JSON类型才可以。
- 因为我只用到了消耗型的内购项目,其它类型的内购项目是否也可以通过本插件结束掉订单,我并不清楚.
测试
用户可以点击支付,然后填完密码点击确定,然后马上结束掉应用进程,等出现购买成功提示框后,再重新启动应用,调用本接口,看是否能查到未完成订单数据.
后记
我在测试的过程中发现有时第一次调用无法取得未结束订单的数据,需要第二次调用才能获取得到,上网搜了说是因为苹果服务器还没有把数据同步过来,所以调用无数据。坑真多,我的做法是支付前调用一下这个方法, 再进行支付,用户在进入页面和刷新页面的时候我也会调用一下这个方法,看有没有未结束的订单。
平台兼容性
Android | iOS |
---|---|
× | √ |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
插件简介
专门用来修复苹果IOS支付时出现"您已购买此App内购买项目。此项目将免费恢复"。
问题描述
首先在IOS平台里面创建“APP内购买项目”,选择的是“消耗型项目”,然后用uni-app官方的支付api进行支付,多支付几次,有时候就会出现提示“您已购买此App内购买项目。此项目将免费恢复”, 特别是在沙盒测试里面支付很大几率出现,我明明选的是消耗型项目,应该每一次都是新的支付,不存在恢复的情况,而且出现这种情况后,后面再怎样支付都是提示这个信息,有时候连删除掉应用, 重新再安装,也是一样的提示,这个对于需要消耗型项目支付的人来说问题太严重了,苹果支付完全没法用,苹果对虚拟产品又不给微信和支付宝进行支付,项目就一直卡在这上面了。
问题原因
上网搜了一圈,发现遇到的人不少,原因是苹果的服务器对大陆访问很慢(特别在沙盒测试环境更加不好),导致用户在购买成功后,收不到苹果的IAP支付成功通知,交易就会一直卡在那里,没有关闭掉,后面无论怎样支付都是提示 “您已购买此App内购买项目。此项目将免费恢复”。
解决问题
找到原因,就开始找补救方法了,补救方法就是需要把上一次未完成的订单结束掉,下一次就可以正常支付了.本插件就是在做这件事。
代码说明
在JS里面引入插件
var zdIospay = uni.requireNativePlugin('ZD-Iospay');
使用说明
var transactionDateresult=zdIospay.ZdIospayFunctionSync('对应苹果里的productid');
var transactionDate = eval("("+transactionDateresult+")");
调用时只需一个参数,就是你苹果里面自己配的消耗型内购项目的productid,程序会找到这个productid对应的订单,如果发现有未结束的订单,自动帮你结束掉。
返回值说明
当没有未结束的订单时,返回
{
"result": "0"
}
当查询到有未结束的订单,返回
{
"result": "0",
"transactionIdentifier": "1000000538781786",
"transactionReceipt": "苹果交易收据",
"transactionState": "1",
}
参数 | 值 |
---|---|
result | 只会返回0,代表插件调用成功 |
transactionIdentifier | 苹果交易订单号 |
transactionReceipt | 苹果交易数据,可以把数据发送到苹果的服务器进行验证真假 |
transactionState | "1"为交易成功,没有其它值,因为只有交易成功,又收不到苹果IAP通知才会卡住,失败订单会自动结束的. |
注:
- 如果查询到有未结束的订单,程序会自动结束掉,并且返回苹果的订单数据,这个数据只会返回一次,下一次再调用因为订单已经结束掉了,所以不会查询到数据了。 这时如果你调自己的服务器失败了,苹果的订单数据就丢了,建议自己可以先缓存在本地,等你调用自己的服务器成功后,再删除掉。
- 插件的返回值是字符串类型,而不是JSON类型,如果需要变成JSON类型需要调用eval("("+transactionDateresult+")")转换成JSON类型才可以。
- 因为我只用到了消耗型的内购项目,其它类型的内购项目是否也可以通过本插件结束掉订单,我并不清楚.
运行环境
本插件只支持真机测试,选择本插件,打包自定义基座,然后在真机上运行.(不支持模拟器运行)
测试
用户可以点击支付,然后填完密码点击确定,然后马上结束掉应用进程,等出现购买成功提示框后,再重新启动应用,调用本接口,看是否能查到未完成订单数据.
后记
我在测试的过程中发现有时第一次调用无法取得未结束订单的数据,需要第二次调用才能获取得到,上网搜了说是因为苹果服务器还没有把数据同步过来,所以调用无数据。坑真多,我的做法是支付前调用一下这个方法, 再进行支付,用户在进入页面和刷新页面的时候我也会调用一下这个方法,看有没有未结束的订单。