uniapp安卓包中的微信,支付宝逻辑放在iOS测试包中也能使用.
但询问iOS开发者后得知,有支付相关功能的app要上架苹果,必须先有苹果支付,不然苹果审核不给过.甚至没有支付逻辑,但打包时有支付相关的SDK也不行,苹果会认为你偷偷做了支付逻辑,想要绕开他.
一. 去苹果开发者后台把支付勾上.
地址:Apple Developer

二.去appstoreconnect里添加一个app内购项目
地址: https://appstoreconnect.apple.com/apps/
苹果好像不允许随意的价格,有多少商品,就要添加多少内购项目.
产品ID是唯一的,即使把创建的内购项目删了,也不能用之前的产品ID,之后支付的代码里也需要用到这个ID.
销售范围,价格时间表等仅供参考.除了app推广,其他项好像必填.
审核信息一栏上传的图片必须是iPhone手机截图,苹果可能做了图片尺寸的校验.
填写好,点击存储.等待添加的app内购项目的状态变为准备提交即可.挺慢的,等了好几分钟,审核信息栏的图片一直在上传状态,等了几分钟就行了.





三.同意新的协议,添加付费app
运行代码报错:{"message":"Payment_appleiap:返回订单信息失败http://ask.dcloud.net.cn/article/282","code":-100},网上搜索后,了解到要同意付费app的协议,苹果会有一个提示,在appstoreconnect里,因为已经同意了所以现在截不了图.
然后还要根据付费app的要求(点击那个问号),完成协议,提供银行业务和税务信息,这一块让公司运营搞的所以也不清楚。
最终结果就是,付费app处于有效状态.
四.支付相关的代码
在模块配置里把苹果支付勾上,之前没勾,现在勾上的,要重新打包.
支付代码: 产品ID就是第二步添加内购项目的产品ID.
<template>
<view>
<button class="subPay" @click="subPaynow"> 立即充值</button>
</view>
</template>
<script>
import { mapState } from 'vuex'
export default {
data() {
return {
iapChannel: null,
productId: '1718558086069075970', //默认苹果内购商品id 要提前在app store connect 配置 要支付的商品的标识(必须是调用uni.requestPayment返回的有效的商品标识)
orderNo:'1252555222512',//订单号
quantity:1,//产品数量
channel:''
}
},
onLoad() {
},
methods: {
subPaynow(){
console.log('支付')
//苹果内购
if (!this.productId) {//没有在苹果content上创建APP内购买项目
uni.showToast({
title: '苹果内购ID缺失,请选择其它支付方式或联系客服',
icon: "none"
});
return false;
}
var that = this
uni.showLoading({
title: '正在支付中...'
});
try {
plus.payment.getChannels(function(channels) {//判读项目支付通道开通情况
for (var i in channels) {
var channel = channels[i];
// 获取 id 为 'appleiap' 的 channel
// console.info("支付通道", channel)
if (channel.id === 'appleiap') {//开通了app应用内支付,在manifest.josn中设置,开通后需打自定议基座
// console.info("苹果支付通道", channel)
that.channel = channel
// ids 数组中的项为 App Store Connect 配置的内购买项目产品ID(productId)
var ids = [that.productId];
// iap 为应用内支付对象
channel.requestOrder(ids, function(e) {
// 获取订单信息成功回调方法
console.log('requestOrder success: ' + JSON.stringify(e));
console.log('username ', that.orderNo);
//
that.transaction = uni.requestPayment({
provider: 'appleiap',
orderInfo: {
productid: that.productId,//产品id,来自于苹果
username: that.orderNo,//订单号
quantity: that.quantity,//产品数量
manualFinishTransaction: true
},
success: (e) => {
uni.hideLoading();
console.info("苹果内购成功", e)
e.payment.orderNo = that.orderNo
//支付成功回调,前端调用后台接口
that.$http
.post(
'api/pay/v1/pay_callback_apple',
e).then(res => {
});
that.finishTransaction()
},
fail: (e) => {
uni.hideLoading();
console.info("苹果内购失败", e)
},
})
},
function(e) {
// 获取订单信息失败回调方法
console.log('requestOrder failed: ' + JSON.stringify(e));
});
}
else{
console.log('不支持苹果支付')
}
}
},
function(e) {
console.log("获取iap支付通道失败:" + e.message);
});
} catch (e) {
uni.showModal({
title: "init",
content: e.message,
showCancel: false
});
} finally {
uni.hideLoading();
}
}
},
}
</script>
<style>
.subPay{
width: 200rpx;
height: 100rpx;
padding-top: 100rpx;
margin:300rpx auto 0 auto;
background-color: #ff0000;
}
</style>

注意:此步后一定要打自定义基座
五.添加沙盒测试员
运行代码测试,购买成功后,一直提示: 此时你没有权限在sandbox购买此inapp .
解决: 添加沙盒测试员后,再去iPhone的设置=>appstore=>沙盒账户,退出原来的沙盒账户,登录刚刚添加的沙盒测试员账户.

每个订单 ,第个沙盒测试员只能买一次,买后得换号


邮箱用过以后的,以后也不能用了,只能用新的,不是必须真邮箱,邮箱随便写,密码要记住,买商品时会在设备上弹出用邮箱和密码的。在购买前要在设置上填。
六.上架遇到的问题
苹果测试员一直用自己的账号测试,但我们的内购项目还没上架成功,他的账号又不在沙盒里,然后一直说我们的支付不能用。想让他用我们的测试号,他也不同意。
网上的说法是,不要直接上架app里的支付,先上架一个版本把内购项目通过,再上架app里的支付功能。
具体的我也没试,做其他项目了,可以用蒲公英分发测试。
苹果开发者写文章都有点官方文档的感觉, 可以用大白话,非要用云里雾里的说法,图贴的也少.
4122






