更新记录

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通知才会卡住,失败订单会自动结束的.

注:

  1. 如果查询到有未结束的订单,程序会自动结束掉,并且返回苹果的订单数据,这个数据只会返回一次,下一次再调用因为订单已经结束掉了,所以不会查询到数据了。 这时如果你调自己的服务器失败了,苹果的订单数据就丢了,建议自己可以先缓存在本地,等你调用自己的服务器成功后,再删除掉。
  2. 插件的返回值是字符串类型,而不是JSON类型,如果需要变成JSON类型需要调用eval("("+transactionDateresult+")")转换成JSON类型才可以。
  3. 因为我只用到了消耗型的内购项目,其它类型的内购项目是否也可以通过本插件结束掉订单,我并不清楚.

    测试

    用户可以点击支付,然后填完密码点击确定,然后马上结束掉应用进程,等出现购买成功提示框后,再重新启动应用,调用本接口,看是否能查到未完成订单数据.

    后记

    我在测试的过程中发现有时第一次调用无法取得未结束订单的数据,需要第二次调用才能获取得到,上网搜了说是因为苹果服务器还没有把数据同步过来,所以调用无数据。坑真多,我的做法是支付前调用一下这个方法, 再进行支付,用户在进入页面和刷新页面的时候我也会调用一下这个方法,看有没有未结束的订单。


平台兼容性

Android iOS
×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
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通知才会卡住,失败订单会自动结束的.

注:

  1. 如果查询到有未结束的订单,程序会自动结束掉,并且返回苹果的订单数据,这个数据只会返回一次,下一次再调用因为订单已经结束掉了,所以不会查询到数据了。 这时如果你调自己的服务器失败了,苹果的订单数据就丢了,建议自己可以先缓存在本地,等你调用自己的服务器成功后,再删除掉。
  2. 插件的返回值是字符串类型,而不是JSON类型,如果需要变成JSON类型需要调用eval("("+transactionDateresult+")")转换成JSON类型才可以。
  3. 因为我只用到了消耗型的内购项目,其它类型的内购项目是否也可以通过本插件结束掉订单,我并不清楚.

    运行环境

    本插件只支持真机测试,选择本插件,打包自定义基座,然后在真机上运行.(不支持模拟器运行)

    测试

    用户可以点击支付,然后填完密码点击确定,然后马上结束掉应用进程,等出现购买成功提示框后,再重新启动应用,调用本接口,看是否能查到未完成订单数据.

    后记

    我在测试的过程中发现有时第一次调用无法取得未结束订单的数据,需要第二次调用才能获取得到,上网搜了说是因为苹果服务器还没有把数据同步过来,所以调用无数据。坑真多,我的做法是支付前调用一下这个方法, 再进行支付,用户在进入页面和刷新页面的时候我也会调用一下这个方法,看有没有未结束的订单。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问