苹果支付的实现

news2024/9/24 15:19:06

由于app经常需要用到支付功能,然而ios用户,是无法用支付宝、微信进行支付,这时候只能用到苹果支付。苹果支付是苹果公司推出的一种在线支付方式,用户可以通过苹果支付购买应用、内购道具等等。

原理

苹果支付的实现原理是通过在应用内调用苹果提供的API来实现的。开发者需要将自己的应用注册到苹果的开发者中心,并在应用内部调用苹果提供的支付API,将支付请求发送到苹果服务器。苹果服务器会验证支付信息,并将支付结果返回给应用。如果支付成功,应用会收到苹果服务器发送的支付成功通知。

注册开发者账号

首先,开发者需要在苹果官网注册一个开发者账号。注册成功后,开发者需要创建一个App ID,并开启支付功能。

apple store 地址:https://appstoreconnect.apple.com/login

苹果官方帮助:https://help.apple.com/app-store-connect/?lang=zh-cn#/devb57be10e7

登录appstoreconnect中心

image.png

现在登录需要双重验证,请确保账户已经开通!

image.png

在appstoreconnect中心找到协议、税务和银行业务

image.png

点击进入协议、税务和银行业务 版块,进行下一步的申请

image.png

可以看到,默认的【免费应用程序】是和账号的到期时间是一致的!

而【付费应用程序】则需要“同意条款”

点击右侧“查看并同意条款

在弹出界面输入您的真实联系地址

image.png

该地址信息请您认真并真实填写!

提示:地址必须是全英文,可以是拼音,如果地址太长可以分2行填写

(注意:这里名称和地址总是报错,说什么参数太长,要注意修改下,之前减少了很多,都不行,后来又突然可以了)

image.png

点击【同意】完整地址信息提交!

地址信息更新之后,跟着设置“税务、银行业务和联系信息”

image.png

点击右侧【税务、银行业务和联系信息】进入设置页面

image.png

在设置页面,点击添加【银行账号】

image.png

温馨提示:个人用户在账户持有人姓名哪里输入拼音;公司用户输入邓白氏编码一致的公司英文名!

按照自己的真实信息填写,公司就写公司,个人就写个人!

这里需要一个CNAPS,是大陆地区每个银行的银联收款号,请电话至您账号的开户行询问!

当然也可以在线查询!前提是你知道自己的开户行详细信息!

image.png

温馨提示:还是建议电话至开户行询问银联12位编码(支付系统行号)!

image.png

输入信息齐全之后,下拉,勾选协议,点击右侧【添加】即可完成

image.png

如图,银行信息就设置好了。

设置税务协议,美国税务协议!

image.png

直接点击【完成】选择美国协议!

当然如果你账号是以下三个国家或中国台湾省的,可以单独勾选,独立填写!

image.png

您是否被视为美国税务居民 (U.S. Tax Resident) ?

一般来说,如果您符合以下条件,则您可被视为美国居民:(1) 在本日历年的任何时间,根据美国移民法,您是美国合法永久居民,该身份未撤销,且未从行政或司法角度认定为已放弃该身份;或者 (2) 您在本年度内至少在美国实际居留 31 天,在包含本年度及前两年在内的总计 3 年期内在美国实际居留至少 183 天。点按此处进一步了解“美国居民”的定义。

image.png

您在美国是否有任何商业活动?

一般来说,如果您在美国有雇员,或在美国拥有、租用或控制设备或其他资产,并且使用这些资产通过 Apple 赚得收入,则表示您在美国有商业活动。

直接选择【否】即可点击【提交】

填写详细税务协议单

image.png

Certificate of Foreign Status of Beneficial Owner

受益所有人的外国身份证明

  1. Individual or Organization Name
    个人或公司组织名 系统默认

  2. Country of Incorporation
    地区或国家 系统默认 中国大陆

  3. Type of Beneficial Owner

受益人类型 自行选择,公司就选公司,个人选个人

  1. Permanent Residence

常住地 系统默认(如不正确,请在第一项地址里面修改)

  1. Mailing Address

邮寄地址 系统默认 (如不正确,请在第一项地址里面修改)

Certification
I declare that the individual or organization named above is the beneficial owner of any payments made under the agreement. I declare that the beneficial owner does not have any employees in the United States and does not own, lease, or control any equipment or other assets in the United States that are used to derive revenue from Apple. I declare that I am either the beneficial owner or that I am authorized to make this declaration on behalf of the beneficial owner.
Name of Person making this Declaration

image.png

以上信息正确,请注意勾选此处协议!

Title :输入框

—— 职位签名,英文名 +CEO 总经理 …

W-8BEN-E 代用表
Certificate of Status of Beneficial Owner for United States Tax Withholding and Reporting (Entities) (Rev. July 2017)

我们建议您在填写 W-8BEN-E 代用表之前先查看 W-8BEN-E 代用表提示页和 W-8BEN-E 报税表说明。

如果您之前提交过 W-8BEN-E 代用表,则您现在填写的 W-8BEN-E 代用表将替换并取代您之前提交的 W-8BEN-E 代用表。

如果您是合伙公司,并且希望通过 Apple Developer Program 申请与您的收入相关的协定利益,请参阅有关提交更新的税务信息的常见问题解答。

该部分可以全部留空!

image.png

Part III: Claim of Tax Treaty Benefits (If Applicable). (For chapter 3 purposes only)
14. I certify that (check all that apply)
The beneficial owner is a resident of China mainland within the meaning of the income tax treaty between United States and that country.
The beneficial owner derives the item (or items) of income for which the treaty benefits are claimed, and, if applicable, meets the requirements of the treaty provision dealing with limitation on benefits. The following are types of limitation on benefits provisions that may be included in an applicable tax treaty (check only one; see instructions):
Type of limitation on benefits provisions

The beneficial owner is claiming treaty benefits for dividends received from a foreign corporation or interest from a U.S. trade or business of a foreign corporation and meets qualified resident status (see instructions).
15. Special rate and Conditions
The beneficial owner is claiming the provisions of Article and paragraph
Optional
of the treaty identified on line 14a above to claim a
Optional
% rate of withholding on (specify type of income):

Income from the sale of applications
Other (please specify)
Optional

image.png

该部分可以全部留空!

image.png

最后勾选协议,底部两处勾选,之后在顶部右边上角【提交】按钮,点击提交!

提交之后耐心等待1-3工作日,如果有特殊需求,苹果会邮件通知,根据邮件修改一下即可!

image.png

image.png

审核通过之后,就可以设置内购项目了!

App 内购买项目配置流程

官方文档:https://help.apple.com/app-store-connect/?lang=zh-cn#/devb57be10e7

登录app store connect:https://appstoreconnect.apple.com/

从“我的 App”中,选择您的 App。

image.png

点击侧边栏的“App 内购买项目”

image.png

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

image.png

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

image.png

注意类型选择即可

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

image.png

image.png

image.png

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

您可以在创建您的 App 内购买项目时输入所有的元数据,或稍后输入您的 App 内购买项目信息。

注意:创建app内购买项目时有时候会报元数据缺失的问题,这时候点进去看下,缺什么数据:一般是价格和审核图片忘记传,填上即可。

创建完之后,一个价格就对应一个产品ID,这个产品ID就是后面你写代码需要用到的。

配置完app内购买项目之后,还有提交 App 内购买项目:https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-for-review

从“我的 App”中,选择您的 App。

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

在右侧,向下滚动至“App 内购买项目”部分,点按“App 内购买项目”旁的添加按钮(+)。

image.png

在“App 内购买项目”对话框中,选择您想要提交的 App 内购买项目。

image.png

点按“完成”,然后“存储”。

当您准备就绪后,提交您的 App 以供审核。

代码实现苹果支付

<script>
    import { validApplyPayApi } from '@/apis/api.js'
    import { mapActions, mapGetters } from 'vuex'
    import { cbSuccess } from '@/utils'
    const IAPOrders = [
        '**6','**18','**68', '**108','**218',
        '**318','**418','**648','**998'
    ] // 根据这些ids获取到苹果app内商品信息,这些ids就是你上面设置的产品id
    
    export default {
        data () {
            return {
                mbs: [6,18,68,108,218,318,418,648,998],
                mb: 68,
                iapChannel: null
            }
        },
        computed: {
            ...mapGetters(['userInfo'])
        },
        onLoad () {
            this.plusReady()
        },
        onShow () {
            this.getUser()
        },
        methods: {
            ...mapActions(['getUser']),
            plusReady() {
                let _this = this
                plus.payment.getChannels(function(channels) {
                    for (let i in channels) {
                        if (channels[i].id == 'appleiap') {
                            _this.iapChannel = channels[i]
                            _this.iapChannel.requestOrder(IAPOrders, function(event) {
                                for (let index in event) {
                                    let OrderItem = event[index]
                                    console.log("Title:" + OrderItem.title + "Price:" + OrderItem.price + "Description:" + OrderItem.description + "ProductID:" + OrderItem.productid)
                                }
                            }, function(e) {
                                console.log("获取支付通道失败:" + e.message)
                            })
                        }
                    }
                }, function(e) {  
                    console.log("获取支付通道失败:" + e.message)
                })
            },
            pay() {
                let _this = this
                let _productId = '**' + this.mb // 当前选择的产品id,根据这个id去对应app内购买项目详情
                uni.showLoading({
                    title: '支付中,请稍后'
                })
                plus.payment.request(_this.iapChannel, {
                    "productid": _productId
                }, function(result) {
                    console.log(result)
                    _this.validPay(result)
                }, function(e) {
                    console.log('支付失败:' + e.code)
                })
            },
            async validPay(result) {// 苹果支付成功之后会返回数据,根据返回数据请求后台接口校验,然后做添加钱等相应业务逻辑
                let _data = {
                    transactionId: result.payment && result.payment.productid,
                    receiptData: result.transactionReceipt
                }
                console.log('valid', _data)
                let { data } = await validApplyPayApi(_data)
                cbSuccess(data, _ => {
                    this.getUser()
                })
                uni.hideLoading()
            }
        }
    }
</script>

我们可以看一下一些相应的打印信息

19:01:59.857  Title:墨币68元Price:68Description:墨币68元ProductID:**68 at pages/course/card.vue:77 
19:02:04.708  Title:墨币418元Price:418Description:墨币418元ProductID:**418 at pages/course/card.vue:77 
19:02:04.728  Title:墨币998元Price:998Description:墨币998元ProductID:**998 at pages/course/card.vue:77 
19:02:04.748  Title:墨币318元Price:318Description:墨币318元ProductID:**318 at pages/course/card.vue:77 
19:02:04.769  Title:墨币18元Price:18Description:墨币18元ProductID:**18 at pages/course/card.vue:77 
19:02:04.789  Title:墨币6元Price:6Description:墨币6元ProductID:**6 at pages/course/card.vue:77 
19:02:04.810  Title:墨币108元Price:108Description:墨币108元ProductID:**108 at pages/course/card.vue:77 
19:02:04.830  Title:墨币218元Price:218Description:墨币218元ProductID:**218 at pages/course/card.vue:77 
19:02:04.851  Title:墨币648元Price:648Description:墨币648元ProductID:**648 at pages/course/card.vue:77

applePay付款成功之后返回的数据如下这样:

{
    "payment": {
        "productid": "**18",
        "quantity": "1"
    },
    "transactionDate": "2021-01-26 19:02:37",
    "transactionIdentifier": "1000000769854176",
    "transactionReceipt": "ewoJInNpZ25hdHVyZSIgP**Zamp1TGd6mFNaEVha2**wWVkvSlJBballnTURNN7Cn0=",
    "transactionState": "1"
}

我们主要需要拿到productid和transactionReceipt(base64形式的字符串)来进行校验来继续后续业务工作。

沙箱测试ApplePay

新app需要将app内购买项目提交审核之后才能测试,并且需要扣钱,好在apple提供了沙箱测试,并不需要审核通过及扣钱就可以测试是否走通。

官方文档:测试 App 内购买项目:https://help.apple.com/app-store-connect/?lang=zh-cn#/dev7e89e149d

您可以使用沙盒测试您的 App 和 App 内购买项目,而无需创建财务交易。沙盒是一个使用 App Store 基础架构但不处理实际付款的测试环境。它会返回交易,付款被视为已成功处理。如创建沙盒测试员帐户中所述,您可以在 App Store Connect 中添加沙盒测试员。

进入app store connect,点击“用户和访问”

image.png

点击沙盒测试员

image.png

请点按添加按钮(+)

image.png

输入测试员信息,然后点按“创建”。

image.png

测试员的邮箱就会收到一个邀请链接,验证一下appid(即邮箱)和密码即可

然后就可以使用该测试员appid进行ApplePay的支付测试了。

使用方法就是,用ios手机,登录建立的测试员账号,在app中点击付费的项目,购买,就可以支付啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/890391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VHDL记录

文章目录 使用function名称作为“常量”numeric_std包集中使用乘法的注意项variable的使用对于entity设置属性的方法在entity声明中嵌入function的定义VHDL仿真读写文件File declaration/File handingFile readingFile writing小例子 使用函数 模块中打印出调试信息 使用functi…

(搜索) 剑指 Offer 12. 矩阵中的路径 ——【Leetcode每日一题】

❓剑指 Offer 12. 矩阵中的路径 难度&#xff1a;中等 给定一个 m * n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构…

.netcore grpc客户端工厂及依赖注入使用

一、客户端工厂概述 gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入AddGrpcClient函数提供了许多配置项用于处理一些其他事项&#xff1b;例如AOP、重试策略等 二、案…

CS5523规格书|MIPI转EDP方案设计|替代LT8911芯片电路原理|ASL集睿致远CS替代龙讯

ASL芯片&#xff08;集睿致远&#xff09; CS5523是一款MIPI DSI输入&#xff0c;DP/e DP输出转换芯片&#xff0c;可pin to pin替代LT8911龙讯芯片。 MIPI DSI 最多支持 4 个通道&#xff0c;每个通道的最大运行速度为 1.5Gps。对于DP 1.2输出&#xff0c;它支持1.62Gbps和2.…

一文揭露AI聊天机器人到底是怎么实现自助应答的

现在很多的企业都会使用客服系统&#xff0c;主要是想通过它们来解决企业的一些问题和需求。所有就衍生了——AI聊天机器人这个新工具&#xff0c;它是把AI人工智能运用到客户服务当中&#xff0c;让AI来帮助我们完成一些解答客户问题的操作。下面我们就来说一下AI聊天机器人是…

创建和使用分区

创建和使用分区 创建一个名为 /home/curtis/ansible/partition.yml 的 playbook&#xff1a; 该palybook包含一个paly&#xff0c;该paly在balancers主机组的主机上运行&#xff1a; 在设备vdb上创建单个主分区&#xff0c;编号为1&#xff0c;大小为1500MiB 使用ext4文件系统…

数据建模和设计for CDGP第五章——如何绘制鸭掌图

CDGP中第五章必考一个数据模型设计题&#xff0c;分值10分。 主要考点 1、围绕一个场景如&#xff08;外卖送餐、图书馆管理系统等&#xff09;进行关系型逻辑数据模型设计2、要求满足范式化&#xff08;通常为3NF&#xff09;3、突出重点的实体并描述实体间的关系 加gzh“大数…

Linux下gdb调试

1.基本命令操作 2.调试方式启动运行无参程序 以下是linux下GDB调试的一个实例&#xff0c;先给出一个示例用的小程序&#xff0c;C语言代码&#xff1a; main.c #include <stdio.h>void Print(int i){printf("hello,程序猿编码 %d\n", i); }int main(int argc…

1281. 整数的各位积和之差

诸神缄默不语-个人CSDN博文目录 力扣刷题笔记 文章目录 1. 简单粗暴的遍历2. 其实也是遍历&#xff0c;但是用Python内置函数只用写一行 1. 简单粗暴的遍历 Python版&#xff1a; class Solution:def subtractProductAndSum(self, n: int) -> int:he0ji1while n>1:last…

杭电比赛总结

我们的队伍&#xff1a;team013 另外两队&#xff1a;team014、team015 ​ 今天是我第一次打杭电&#xff0c;发现杭电多数都是猜结论题 先给一下我们的提交数据 Submit TimeProblem IDTimeMemoryJudge Status4:59:59101115 MS1692 KWrong Answer4:59:55101115 MS1684 KWrong…

互联网发展历程:畅通无阻,流控的智慧应对

随着互联网的蓬勃发展&#xff0c;网络使用量不断增加&#xff0c;可能导致网络拥挤问题。在这个数字化时代&#xff0c;人们需要寻找一种方法来优化网络使用&#xff0c;确保数据的流畅传输。而在这一背景下&#xff0c;流量控制&#xff08;流控&#xff09;应运而生。 网络拥…

如何使用SpringBoot 自定义转换器

&#x1f600;前言 本篇博文是关于SpringBoot 自定义转换器的使用&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的…

Android Studio实现解析HTML获取图片URL,将URL存到list,进行瀑布流展示

目录 效果展示build.gradle(app)添加的依赖(用不上的可以不加)AndroidManifest.xml错误代码activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL效果展示 build.gradle(app)添加的依赖(用不上的可以不加) dependencies {implementation co…

TRT8系列—— 版本差异注意事项

TRT8 一个大版本&#xff0c;8.4-、 8.5、 8.6&#xff08;包含预览功能&#xff09;却有很多变动&#xff0c;一不注意就发现很混乱&#xff0c;特备注此贴。建议具体case可以参考这个合集&#xff0c;真心安利&#xff1a;https://github.com/NVIDIA/trt-samples-for-hackath…

VirtualBox移动虚拟机存储位置,给C盘瘦身

不知不觉&#xff0c;五月份买的电脑的C盘突然要爆了。 我也搞不懂我的软件明明都放在D盘&#xff0c;C盘还是那么满。直到我看到了之前VirtualBox的一些东西。好家伙&#xff0c;直接干了我快30G了。 所以&#xff0c;我在想能不能将这些东西移到D盘&#xff0c;同时也不影响我…

android framework-Pixel3真机系统内置第三方apk实战

一、在/packages/apps创建独一无二的文件夹TestCamera 二、拷贝第三方应用到TestCamera文件夹下 三、创建Android.mk LOCAL_PATH: $(call my-dir)include $(CLEAR_VARS) # Module name should match apk name to be installed LOCAL_MODULE : TestCamera LOCAL_MODULE_TAGS : o…

scrollIntoView 导致整个页面上移问题

更改参数 block: ‘start’, behavior: smooth’更改为 behavior: ‘smooth’, block: ‘nearest’, inline: ‘start’ 在这里插入图片描述

JVM---jvm里的内存溢出

目录 堆溢出 虚拟机栈和本地方法栈溢出&#xff08;栈溢出很少出现&#xff09; 方法区和运行时常量池溢出 本机内存直接溢出&#xff08;实际中很少出现、了解即可&#xff09; 堆溢出 堆溢出&#xff1a;最常见的是大list&#xff0c;list里面有很多元素 堆溢出该怎么解决…

棋牌的逆向工程

前言 之前有些朋友都找我做棋牌的逆向工程 一来就说什么透视啥的 我只能让你早点洗洗睡 不过话说回来 棋牌逆向的思路也是有很多的 例如撞库 溢出 透视吧也能实现不过难度可想而知 透视有些棋牌是可以 不过只能看手里自己的牌例如炸金花 没开牌的时候内存中可能会存放当前的牌…

第四章nginx组件精讲

nginx配件location匹配的规则和优先级&#xff08;重点面试题&#xff09; RUI&#xff1a;统一资源标识符&#xff0c;是一种字符串标识&#xff0c;用于标识抽象的或者物理资源&#xff08;文件&#xff0c;图片&#xff0c;视频&#xff09; nginx当中&#xff1a;uri ww…