`
lzqustc
  • 浏览: 212725 次
  • 性别: 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语言来处理这些流程,开发者可以构建出安全、可靠的移动应用。

    【go】微信App支付、支付宝App支付服务端Demo_pgj.zip

    这个微信App支付和支付宝App支付服务端的演示程序,不仅是一个功能完备的支付服务实现,也是一个很好的学习Go语言网络编程和移动支付集成的案例。通过这个项目,开发者可以快速掌握在Go语言环境下集成和使用微信及...

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

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

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

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

    支付宝手机支付接口

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

    基于JavaScript开发的自助入住平台服务端源码

    首先,该项目的核心是使用JavaScript语言开发,这表明它可能主要采用了Node.js作为运行环境,因为Node.js是JavaScript在服务端的主要实现方式,能够提供高性能的网络应用服务。JavaScript作为一种广泛使用的脚本语言...

    基于Java语言的applePay支付功能设计源码

    Java语言作为当前企业级应用开发中最受欢迎的编程语言之一,其在移动支付领域的应用同样具有重要意义。特别是对于iOS平台的支付解决方案,ApplePay作为苹果公司提供的移动支付服务,其安全性和便捷性得到了广泛的...

    【Java】java实现微信小程序商城,app商城服务端(附带后台)_pgj.zip

    本项目名为“【Java】java实现微信小程序商城,app商城服务端(附带后台)_pgj.zip”,是一个使用Java语言开发的,面向微信小程序和App商城的后端服务端解决方案。通过该项目,开发者可以快速搭建起一个功能完整的电商...

    Bbgshop微信商城服务端.zip

    在微信商城服务端开发中,通常需要考虑到微信支付接口的集成,因为支付是电商交易中至关重要的一环。除此之外,还有用户鉴权、商品信息管理、订单处理、物流跟踪等功能需要实现。开发者需要利用微信提供的API接口,...

    基于Node.jsKoa2开发微信小程序服务端.zip

    本教程主要针对使用Node.js中的Koa2框架来开发微信小程序服务端的全过程进行介绍,内容涵盖从基础搭建到高级功能实现的各个方面。 首先,Koa2作为Node.js新一代的Web框架,以其简洁的中间件流程控制方式,为开发者...

    【毕业设计】基于springmvc实现的购物商城的项目的服务端,仿照的是天猫网_pgj.zip

    对于毕业设计来说,一个基于SpringMVC实现的购物商城的服务端项目,不仅能够帮助学生理解和掌握当前流行的Web开发框架,同时也能够提高学生解决实际问题的能力。 SpringMVC是一种基于Java语言的,实现了Spring框架...

    【java】小卖部小程序项目:包含微信小程序+Java后台服务端_pgj.zip

    Java语言由于其平台无关性、强大的类库支持和成熟的生态系统,已经成为企业级应用开发的首选语言之一。利用Java语言开发的服务端能够提供高性能、高稳定性的后台支持,这对于小程序的用户体验和业务发展至关重要。 ...

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

Global site tag (gtag.js) - Google Analytics