`
lzqustc
  • 浏览: 209859 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

苹果应用内支付之服务端的实现

    博客分类:
  • Perl
阅读更多

本文主要讲移动APP实现苹果支付的服务端实现步骤。

 

苹果应用内支付的流程可参考:

1、 官网说明:https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

 

2、中文博客:https://mengkang.net/723.html

 

简要说明如下:

1、首先客户端先请求苹果支付中心,支付中心返回给客户端一堆加密的数据。

2、然后客户端把这段加密的数据传给服务端。

3、最后由服务端端再去请求苹果支付中心来验证这次购买是否成功。如果验证通过,服务器端对业务逻辑进行处理。

 

本例实现方式:

客户端和服务端之间采用的websocket + JSON格式数据的通信方式。

服务端业务逻辑部分采用是Perl语言编写。

 

1、接口参数

{

"order_id":订单号(前端生成,32个字符内,保证唯一性)

"receipt_data":"MIITuwYJKoZIhvcNAQcCoIITrDCCE6g..."支付中心返回给客户端的加密数据

}

 

2、服务端请求支付中心验证票据

sub apple_check_receipt {

    my $receipt_data = $_[0];

 

    my $endpoint_debug = "https://sandbox.itunes.apple.com/verifyReceipt";  #开发环境,采用苹果沙盒地址

    if(__PACKAGE__ eq "PRODUCT") {

        $endpoint_debug = "https://buy.itunes.apple.com/verifyReceipt"; #生产环境

    }

    # 构造请求的参数(json格式)

    my $apple_receipt;

    $apple_receipt->{"receipt-data"} = $receipt_data;

 

    my $header = HTTP::Headers->new( Content_Type => 'application/json; charset=utf8', );

    my $json = JSON->new();

    my $http_request = HTTP::Request->new( POST => $endpoint_debug, $header, $json->encode($apple_receipt));

 

    #anlyse this response

    my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0, SSL_verify_mode => 0x00 });

    $ua->timeout(30); 

    my $response = $ua->request($http_request);

    my $json_return;

    if ($response->message ne "OK" && $response->is_success ne "1") { #出错,或者timeout了

        return "timeout";

    } else {

        $json_return =  $json->decode($response->content());

    }

    # 验证苹果中心返回的结果

    if ($json_return->{status} eq "0") {

        my $in_app = $json_return->{receipt}->{in_app}[0];

        $result->{transaction_id} = $in_app->{transaction_id};

        if (length($result->{transaction_id}) == 0) {

            return "transaction_id is null";

        } elsif (length($in_app->{product_id}) == 0 || index($in_app->{product_id}, "abc.cdf.x") < 0) {

            return "product_id is invalid";

        }

         # 根据业务需求,验证其他字段

        .....

    }

    return "success";

}

 

验证票据请求返回结果的内容一般如下:

response: {

       environment: "Production", 

        receipt: {

            adam_id: 1155833660, 

            app_item_id: 1155833660, 

            application_version: "1", 

            bundle_id: "**********", 

            download_id: null, 

            in_app: [

                {

                    is_trial_period: "false", 

                    original_purchase_date: "2017-02-21 06:25:12 Etc/GMT", 

                    original_purchase_date_ms: "1487658312000", 

                    original_purchase_date_pst: "2017-02-20 22:25:12 America/Los_Angeles", 

                    original_transaction_id: "710000191974963", 

                    product_id: "***********", 

                    purchase_date: "2017-02-21 06:25:12 Etc/GMT", 

                    purchase_date_ms: "1487658312000", 

                    purchase_date_pst: "2017-02-20 22:25:12 America/Los_Angeles", 

                    quantity: "1", 

                    transaction_id: "710000191974963"

                }

            ], 

            original_application_version: "1", 

            original_purchase_date: "2017-02-21 06:25:12 Etc/GMT", 

            original_purchase_date_ms: "1487658312000", 

            original_purchase_date_pst: "2017-02-20 22:25:12 America/Los_Angeles", 

            receipt_creation_date: "2017-02-21 06:25:12 Etc/GMT", 

            receipt_creation_date_ms: "1487658312000", 

            receipt_creation_date_pst: "2017-02-20 22:25:12 America/Los_Angeles", 

            receipt_type: "Production", 

            request_date: "2017-02-21 06:25:22 Etc/GMT", 

            request_date_ms: "1487658312010", 

            request_date_pst: "2017-02-20 22:25:22 America/Los_Angeles", 

            version_external_identifier: 820590861

        }, 

        status: "0"

 

    },

每个字段的含义可以参考官网说明:https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1

 

关键信息是在 in_app这个数组里面,可以根据自身情况,校验相应字段的合法性。

 

生产环境中还经常出现in_app为空数组的情况,比如下面的结果:

response: {

        environment: "Production", 

        receipt: {

            adam_id: 1155833660, 

            app_item_id: 1155833660, 

            application_version: "1", 

            bundle_id: "***********", 

            download_id: 83024344988508, 

            in_app: [ ], 

            original_application_version: "1", 

            original_purchase_date: "2017-03-26 10:26:17 Etc/GMT", 

            original_purchase_date_ms: "1490523977000", 

            original_purchase_date_pst: "2017-03-26 03:26:17 America/Los_Angeles", 

            receipt_creation_date: "2017-03-26 10:26:17 Etc/GMT", 

            receipt_creation_date_ms: "1490523977000", 

            receipt_creation_date_pst: "2017-03-26 03:26:17 America/Los_Angeles", 

            receipt_type: "Production", 

            request_date: "2017-03-26 10:26:27 Etc/GMT", 

            request_date_ms: "1490523977010", 

            request_date_pst: "2017-03-26 03:26:27 America/Los_Angeles", 

            version_external_identifier: 821061739

        }, 

        status: "0"

    },

 

这种都是不正常的。

 

另外客户端输入参数里面有order_id(保证唯一性)可以用来防止同一个票据数据receipt_data,重复发送导致服务端重复执行业务逻辑的问题。

 

 

 

 

 

 

分享到:
评论

相关推荐

    goAppstoreIap:通过苹果验证应用内购买的 go 实现

    在IT行业中,应用内购买...总的来说,使用Go语言实现苹果应用内购买验证是一项涉及安全性和用户体验的重要任务。通过理解苹果的IAP机制以及正确地使用Go语言来处理这些流程,开发者可以构建出安全、可靠的移动应用。

    java后台提供给ios的微信支付接口

    在IT行业中,微信支付是一种广泛使用的在线支付方式,特别是在移动端应用中。对于iOS开发者来说,与后端服务器进行交互以实现微信支付功能是至关重要的。本篇将详细讲解如何利用Java后端为iOS应用构建微信支付接口。...

    iphone 推送通知 服务器端java 实现

    在iOS应用开发中,为了实现在用户不使用应用程序时也能接收到消息,苹果公司提供了Apple Push Notification service(APNs)服务。本篇文章将详细介绍如何在服务器端使用Java来实现iPhone的推送通知功能。 首先,...

    支付宝手机支付接口

    支付宝手机支付接口是移动应用中实现在线支付的关键技术,它允许用户通过智能手机便捷地完成交易。这个接口适用于Android和iOS两大主流操作系统,涵盖了客户端和服务器端的交互过程,确保了跨平台的兼容性和安全性。...

    sushido点餐系统应用

    4. **支付集成**:集成Apple Pay或其他第三方支付SDK,实现安全的支付流程。 5. **推送通知**:利用Apple Push Notification Service,及时推送订单状态更新信息。 三、应用场景 Sushido点餐系统适用于各类餐饮场所...

    新开发大型购物商城网站JAVA开源源码 内含小程序源码+安卓IOS双端原生源码.zip

    商城小程序源码是针对微信小程序的开发,它让用户能够在微信内直接进行购物,无需安装额外的应用。小程序源码通常包括多个页面组件(如商品列表、详情页、购物车、支付页面等),并使用微信提供的SDK进行接口调用。...

    星空版千月影视APP源码无限代理版 支持iOS+安卓双端打包.rar

    这部分源码可能是用某种服务器端语言(如Java、Python或Node.js)编写,与前端H5页面和移动客户端协同工作,实现应用的核心功能。 综合以上内容,这个源码包提供了一个完整的VIP影视APP解决方案,包括前后端开发...

    NotificationVoiceSpeech:推送消息自定义语音播报(后台,前台,杀死状态),仿支付宝收款提醒

    在iOS应用开发中,有时我们需要实现类似支付宝那样的自定义语音播报功能,特别是在处理推送通知时。"NotificationVoiceSpeech"项目正是这样一个解决方案,它允许在应用处于后台、前台甚至是被杀死的状态下,对推送...

    基于ssm思途旅游管理系统.zip

    **微信小程序**是移动端的应用形态,可在微信内运行,无需下载安装。在旅游管理系统中,对接微信小程序可以提供便捷的用户体验,让用户能够随时随地浏览和预订旅游产品,支付功能也可能通过微信支付接口实现。 总的...

    同城购电表端自定义消息格式

    在IT行业中,"同城购电表端自定义消息格式"是一个特定的应用场景,涉及客户端-服务器(CS)架构,自定义通信协议以及数据库交互。在这个系统中,客户端(通常是电力表设备或者用户终端)与服务器进行通信,以完成购...

    基于SpringBoot的网上超市源码数据库.doc

    为此,设计并开发一个基于SpringBoot框架的网上超市系统成为了必要之举。该系统不仅能节省人力资源和管理成本,还能有效地存储大量数据,并方便快捷地处理商品销售信息的维护与检索。 #### 关键技术介绍 - **...

    基于SpringBoot+Vue的电商应用系统源码数据库.doc

    ### 基于SpringBoot+Vue的电商应用系统设计与实现 #### 一、项目背景与意义 随着现代经济的快速发展以及信息技术的不断进步和完善,传统的数据管理模式已经无法满足日益增长的数据处理需求。在此背景下,一种更为...

    基于ssm+vue的校园电子商城.zip

    本项目可能通过API接口与后端SSM系统进行数据交互,实现商品浏览、购物车、订单支付等功能,从而满足用户在手机上的购物需求。 五、数据库设计与优化 在数据库层面,可能会采用MySQL作为主要的存储引擎,设计合理...

    基于微信小程序的短文写作竞赛管理系统.zip

    开发者可以使用微信提供的开发工具和API,创建出与原生APP体验相似的应用,实现各种功能,如用户登录、支付、推送通知等。 2. **Java**:Java是一种广泛使用的后端开发语言,尤其在企业级应用中占据重要地位。在...

    基于springboot的美食推荐商城源码数据库.doc

    - **应用场景**:适用于快速构建Web应用程序和服务端应用程序。 2. **Java语言**: - **简介**:Java是一种广泛使用的面向对象编程语言,具有高度的跨平台性,能够在不同的操作系统上运行相同的代码。 - **优点*...

    基于ssm小驴西藏旅游网站的设计与实现.zip

    "微信小程序"则意味着该项目可能还包括了一个与之配套的移动端应用,用户可以通过微信小程序进行浏览、预订等操作。 【文件名称列表解析】 由于只有一个文件名"基于ssm小驴西藏旅游网站的设计与实现",可以猜测这...

    基于Java的 iOS 推送通知

    提供商(即APP服务端)将通知发送至Apple Push Notification Service (APNS),APNS随后将通知传递到目标iOS设备,最后由iOS系统将通知推送给特定的应用程序。提供商是唯一需要用户自定义的部分,而其他过程则完全由...

    Radmin3.0 控制端(绿色版)

    Radmin 3.0是一款在业界广泛应用的远程控制软件,以其高效、便捷和安全的特点深受用户喜爱。它提供了丰富的功能,包括文件传输、远程关机等,使得远程管理与协作变得极其简单。绿色版的Radmin 3.0更是以其无需安装、...

    音乐播放器小程序代码.rar

    此外,还有网络请求API(`wx.request`)用于获取音乐资源和服务端数据。 4. **页面路由与导航**: 在小程序中,页面间的跳转通过`wx.navigateTo`,`wx.navigateBack`等函数实现。在"Apple Music"这样的音乐播放器...

Global site tag (gtag.js) - Google Analytics