uni-app实现苹果内购支付功能

更新日期: 2021-12-23阅读: 2.1k标签: uniapp

背景

Appstore审核报PGPay SDK不允许上架的问题

数字类产品(比如购买会员等不需要配送实物的商品),Apple规定必须使用苹果IAP应用内支付,给Apple分成30%。打包的时候不要勾选微信或支付宝等其他支付方式。如果你提交的包里包含了微信支付宝等支付的sdk,即使没使用,Appstore也会认为你有隐藏方式,以后会绕过iap,不给Apple分成,因此拒绝你的App上线。云打包时,manifest里选上支付模块,但sdk配置里去掉微信支付和支付宝支付。很多开发者的Android版是包含微信和支付宝支付的,此时注意分开判断。


苹果支付流程

1.向 AppStore 请求有效的商品详情

2.发起支付请求

3.支付完成后, 将购买凭证发送至服务端验证

4.服务端将凭证发送到苹果服务验证

5.验证成功发放商品


苹果支付与微信和支付宝支付的不同点

1.微信和支付宝支付支付成功后,会将支付结果发送给你的服务器;而苹果支付支付成功后需要你自己把支付结果从app发送给自己的服务器,所以苹果支付容易出现丢单情况,比如支付途中强行关闭app,这时依然会支付成功,但是你的服务器收不到任何通知。

2.使用微信和支付宝支付你必须在自己的服务器上先生成一个订单,支付成功后微信和支付宝会把该订单的单号和支付结果一起通知给你;苹果支付不关心你服务器上的订单,在最后的验证结果中只会告诉你用户购买了哪个产品,不会告诉你是你服务器上的哪个订单。

3.微信和支付宝可以支付任意额度金额,但是苹果支付的金额是提前设定好的,无法随意更改。

4.苹果支付是可以在苹果那里直接申请退款的,不需要经过开发者的同意,但是会向你的服务器发送退款通知,请注意这点。


准备部分

a.签署《付费应用程序协议》 

1.请在首页上,点按“协议、税务和银行业务”。 

2.在“协议”部分找到《付费应用程序协议》,然后点按“查看并同意条款”。 

3.请确保对话框中您的法律实体信息正确,然后点按“添加”。此处所输入的信息应该与“帐户持有人”注册“Apple 开发 者计划”时所提供的信息一致。 

4.阅读并接受条款,然后点按“同意”。您还可以下载协议的副本。 重要事项:一旦请求此合同,您就不能撤销此操作,也不能回到针对免费 App 的《开发者计划许可协议》。 

b.在 App Store Connect 中配置 App 内购买项目
1. 从“我的 App”中,选择您的 App。 

2. 在侧边栏的“App 内购买项目”下方,点按“管理”。

 3. 若要添加 App 内购买项目,请前往“App 内购买项目”,并点按添加按钮(+)。 

4. 选择“消耗型项目”、“非消耗型项目”或“非续期订阅”,并点按“创建”。有关自动续期订阅的信息,请参见创建 自动续期订阅。 

5. 添加参考名称、产品 ID 和本地化显示名称。 

6. 点按“存储”或“提交以供审核”。

产品类型解释: 消耗型项目是一种使用一次之后即失效的项目。用户可以多次购买这类项目。 非消耗型项目是一种用户只需购买一次的项目。这类项目不会过期。 服务或内容的自动续期订阅是一种用户购买一次之后,只要用户不选择取消,就会一直自动续期的项目。 服务或内容的非续期订阅有特定访问时限,不会自动续期。用户可以再次购买这类项目。 

c.增加测试账号 

测试账号可以测试苹果支付 

1.选择“用户与访问” 

2.选择沙箱测试员 

3.添加测试员 注:

  • 1、邮箱必须是没有注册或者说关联过appstore的邮箱。
  • 2、密码必须有一个是大写字母有一个是小写字母(苹果规定的,理解)。 
  • 3、内购屏幕截图规格必须是312*290,且最低分辨率是72ppi。
  • 4、内购的价格是苹果规定的不能自定义(坑啊)。


uni-app代码开发

首先我们需要勾选苹果支付,在manifest.json中,选择App模块配置->Payment(支付)。

然后打包需要选择打基座包来测试。

前端代码实现

先在头部定义商品id 全部商品id (在苹果商店申请的真实商品id)

let iapChannel = null;
var productId = 'lvbi_a';
var productIds = ['lvbi_a'];

进入页面就判断

//1.获取支付渠道
plus.payment.getChannels((channels) => {
for (var i in channels) {
var channel = channels[i];
//苹果支付
if (channel.id === 'appleiap') {
iapChannel = channel;
this.requestOrder(); //关键
}
}
if (!iapChannel) {
that.errorMsg()
}
}, (error) => {
that.errorMsg()
});
requestOrder() {
    iapChannel.requestOrder(productIds,(orderList) => { //必须调用此方法才能进行 iap 支付
        uni.hideLoading();
    }, (e) => {
        uni.hideLoading();
            this.errorMsg()
    });
},        

调接口获取真实的商品id

// 获取页面内容
getAppleProducts() {
AppleProducts({
openid:this.openid,
token:this.tpken
}).then(res =>{
if(res.code == 1){
this.data = res.data;
this.price = this.data.products[0];
productId = this.data.products[0].product_id;
productIds = this.data.products_ids;
}
})
},

确定支付

topupprice() {
let that = this;
uni.showLoading({});
uni.requestPayment({
provider: 'appleiap',
orderInfo: {
productid: productId
},
success: (e) => {
uni.hideLoading();
var statement = {
productid: productId
}
// 支付成功查询订单
plus.payment.request(iapChannel, statement, function(res){
paysuccers({
data:{
openid:that.openid,
token:that.token,
receipt_data:JSON.stringify(res)
}
}).then(tow =>{
uni.hideLoading();
if(tow.code == 1){
uni.showToast({
title:tow.msg,
icon:'none'
})
}else{
uni.showToast({
title:tow.msg,
icon:'none'
})
}
})
}, function(){

});
},
fail: (e) => {
uni.hideLoading();
uni.showModal({
content: "支付失败,原因为: " + e.errMsg,
showCancel: false
})
}
})
},


链接: https://www.fly63.com/article/detial/10962

uni-app 微信小程序授权登录

uni.getUserInfo 接口调用方式起初通过button 来获取用户信息,或者 直接调用 uni.getUserInfo 来获取信息 在当前微信更新接口后,这2个接口将直接返回匿名用户数据,不在弹窗提示

uniapp之this作用域

发现了点击按钮1可以更新title内容,但是点击按钮2却无法更新title内容。这个究竟是为什么呢?在changeTitle2方法的success方法中,该success方法指向闭包,所以this属于闭包

uniapp 页面跳转传值和接收

首先介绍最原始的跳转方法,类似于html中的 a 标签,不过在uniapp中需要将 a 标签换成 <navigator url=跳转的地址>……</navigator>

uniapp开发注意事项

static 目录下的 js 文件不会被编译,如果里面有 es6 的代码,不经过转换直接运行,在手机设备上会报错。css、less/scss 等资源同样不要放在 static 目录下

uniapp验证码倒计时60s的实现

发送验证码时,不能让客户一直发送验证码,所以需要设置一个60s后才能发送一次;具体代码实现:因为app和其他app不太一样,所以需要选择以这样的方式展示是时间,但是js逻辑代码是一样的;

uni-app中使用computed计算属性

computed里面的属性不能在data属性中出现,用来监控computed中自定义的变量 ,computed合适多个变量或对象处理后返回一个结果值,其中一个值发生变化则computed监控的属性值就会发生变化

uni-app开发经验分享: 多页面传值的三种解决方法

开发了一年的uni-app,在这里总结一些uni-app开发中的问题,提供几个解决方法,分享给大家:问题描述:一个主页面,需要联通一到两个子页面,子页面传值到主页面,主页面更新

uni-app开发注意事项

当重复设置某些属性为相同的值时,不会同步到view层。 例如:每次将scroll-view组件的scroll-top属性值设置为0,只有第一次能顺利返回顶部。 这和props的单向数据流特性有关

uniapp页面通信方法总汇

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。

uniapp/小程序实现Url生成二维码图片

基于QR.createQrCodeImg方法生成二维码,在使用uniapp开发的小程序,app应用,某一页面需要将网页Url生成的二维码进行展示,即将Url生成为base64的二维码图片。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!