更新记录

2.0.1(2022-09-15)

全新升级,更简洁的api调用,更简洁的流程 增加本地验证,没有服务器也可以完成内购 增加新接口,减少丢单

1.1.0(2022-02-21)

增加恢复交易功能,从而修复漏单的bug

1.0.0(2021-02-02)

完成内购功能

查看更多

平台兼容性

Android iOS
× 适用版本区间:9 - 15

原生插件通用使用流程:

  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原生插件配置”->”云端插件“列表中删除该插件重新选择


一、插件说明

测试时需要你自己创建商品后测试
测试时需要你自己创建商品后测试
测试时需要你自己创建商品后测试

userId请传入字符串类型

二、解释

1)内购商品分几种,恢复购买只是针对非消耗型

  • PurchaseTypeConsumable = 0, ///消耗型,比如金币
  • PurchaseTypeNonConsumable = 1, ///非消耗型,比如去除广告
  • PurchaseTypeAutoRenewable = 2, ///自动续订的,比如网易云VIP
  • PurchaseTypeNonRenewing = 3, ///非自动续期,比如买一个月VIP这种,不会自动续期

2)内购其实不需要服务器也能完成,就是采用本地验证,就是本地调用苹果服务器去验证,只是说没有服务器去验证安全,如果你没有服务器,也可以使用插件内的本地验证完成验证

3)有时候内购会因为一些操作打断,所以为了防止丢单,在每次应用启动你都应该调用compleTransactions来防止丢单

4)参数说明,每个接口详细使用可以参考demo,需要注意参数类型,具体每个接口调用都有demo演示,注意本地验证的接口参数不能传错。

5)关于回调

///completeTransactions回调,会返回成功的商品id和收据信息,
如果你使用服务器验证,就将数据上传服务器即可,如果使用本地验证,
则调用本地验证接口
{"msg":"支付成功", "code":"success",
 "productId" : "productId", "data": "收据信息"}
{"msg":"没有成功", "code":"fail", "productId" : "productId"}

///verifyTransactions回调,
{"msg":"支付成功,且验证成功", "code":"success"}
{@"msg":@"没有购买成功", @"code":@"fail"}

///restoreCompletedTransactions回调,会返回恢复成功的商品列表,和失败的列表,列表是商品id
{"msg":"操作完成", "code":"success", "data" : result}

///buyProduct回调,
{"msg":"请选择商品", "code":"noproduct"} ///没有传商品id
{"msg":"deferred", "code":"deferred"} ///交易队列还在进行,结果未知
{"msg":"支付成功", "code":"success", "data": "收据信息"} ///成功,返回了收据信息,下一步你应该进行验证
{"msg":"unknown error", "code":"unknown"}
{"msg":"clientInvalid", "code":"clientInvalid"}
{"msg":"paymentCancelled", "code":"paymentCancelled"}
{"msg":"paymentInvalid", "code":"paymentInvalid"}
{"msg":"paymentNotAllowed", "code":"paymentNotAllowed"}
{"msg":"storeProductNotAvailable", "code":"storeProductNotAvailable"}
{"msg":"cloudServicePermissionDenied", "code":"cloudServicePermissionDenied"}
{"msg":"cloudServiceNetworkConnectionFailed", "code":"cloudServiceNetworkConnectionFailed"}
{"msg":"cloudServiceRevoked", "code":"cloudServiceRevoked"}

三、插件使用

具体使用请看示例工程,有问题加Q:724300087,请备注说明,或者加群:235114842

<template>
    <view class="content">
        <image class="logo" src="/static/logo.png"></image>
        <view class="text-area">
            <text class="title">{{title}}</text>
        </view>
        <button @tap="buy">buy</button>
        <button @tap="restore">restore</button>
    </view>
    <view class="" style="text-align: center; color: #cf6c6c;">

    </view>
</template>

<script>
    var hxrinpurchase = uni.requireNativePlugin("HXR-InPurchaseManager");
    export default {
        data() {
            return {
                title: 'Hello'
            }
        },
        onLoad() {

        },
        methods: {
            restore: function(e) { ///恢复购买只只是针对非消耗性商品
                let parameter = {"userId" : "你的用户标识"} ///用户标识没有可以不传或者传空字符串,类型是字符串
                hxrinpurchase.restoreCompletedTransactions(parameter,function(res){
                    ////调用这个接口会返回恢复成功的商品id,和失败的id,两个都是数组
                    if(res && res.data) {
                        let successProducts = res.data.success
                        let failProducts = res.data.fail
                        ///该发放奖励就发放
                    }
                });
            },
            buy: function(e) {
                ///用户标识没有可以不传或者传空字符串,类型是字符串
                /// quantity 商品购买数量,一般情况是1,根据你的内购决定
                hxrinpurchase.buyProduct({'productId' : 'com.xxx.ccccc', 'userId':'xxxx', "quantity": 1}, function(res) {

                    uni.showModal({
                        title:"提示",
                        content:JSON.stringify(res),
                        confirmText: "确认"
                    });
                    if(res && res.code == 'deferred') {
                        ///交易队列还在进行,结果未知
                    } else if (res && res.code == 'success') {
                        ///成功,下一步应该验证收据
                        if(true) { ///本地验证
                            ///本地验证参考App.vue
                        } else {
                            ///上传数据到服务器
                        }
                    } else {
                        ///发生其他错误
                    }

                });
            }
        }
    }
</script>

<style>
    .content {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }

    .logo {
        height: 200rpx;
        width: 200rpx;
        margin-top: 200rpx;
        margin-left: auto;
        margin-right: auto;
        margin-bottom: 50rpx;
    }

    .text-area {
        display: flex;
        justify-content: center;
    }

    .title {
        font-size: 36rpx;
        color: #8f8f94;
    }
</style>

隐私、权限声明

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

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

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

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