苹果支付 PHP 服务端处理

2021/6/15 12:21:23

本文主要是介绍苹果支付 PHP 服务端处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

因为上周末连续加班 2 天(产品非要周一上线新版本),因此断更公众号一段时间,今天继续补上。

 

之前有了微信和支付宝支付后,产品要加上苹果支付,于是有了这篇文章。

一、ios 端流程

itunnes 相关配置

一.在itunnes 上配置相关信息资料

首先需要配置一些前提条件,详细步骤如下

1.进入itunnes选择协议,税务银行业务

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

2.完善资料信息,主要有3项(联系人,银行信息,税务信息)
3.完善联系人信息,一般填申请开发者账号人员的信息,可以修改

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

4.完善银行信息 需要银行支付号(就是开户银行的一个标识),银行卡持有人名字

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

5.完善税务信息

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

6.以下默认选择no

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

7.确认界面,下图可能不太对,当时我是上下2个界面,第四项要上下一致才行

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

上面资料完善后换需要配置相关虚拟物品

1.选择对应应用
2.选择功能,我们添加一个app内购项目。
3.选择类型
a.可消费的产品 使用一次,之后就会耗尽,必须再次购买
b.非消耗品 一次购买的产品,不会到期,这种物品一般来说要使用恢复购买的功能
c.自动订阅类内购 这种物品会在一段时间内自动订阅
d.非自动订阅 如一次订阅一年的服务会员
4.提交一个屏幕快照(注意尺寸大小一般是用到内购的界面)。
三.接下来需要添加沙箱测试账号,此账号是在测试环境测试内购流程的
1.点击进入用户和职能界面
2.选择沙盒技术测试员
3.填写测试员信息(填写未被其他开发者使用的邮箱)
内购实现流程

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

本地处理

  1. 程序通过bundle存储的plist文件得到产品标识符的列表。

  2. 程序向App Store发送请求,得到产品的信息。

  3. App Store返回产品信息。

  4. 程序把返回的产品信息显示给用户(App的store界面)

  5. 用户选择某个产品

  6. 程序向App Store发送支付请求

  7. App Store处理支付请求并返回交易完成信息。

  8. App获取信息并提供内容给用户。
    依靠服务器处理 (一般需要一个订单号对应相应的凭证信息)

  9. 程序向服务器发送请求,获得一份产品列表。

  10. 服务器返回包含产品标识符的列表。

  11. 程序向App Store发送请求,得到产品的信息。

  12. App Store返回产品信息。

  13. 程序把返回的产品信息显示给用户(App的store界面)

  14. 用户选择某个产品 生成订单号

  15. 程序向App Store发送支付请求

  16. App Store处理支付请求并返回交易完成信息。

  17. 程序从信息中获得数据,(目前是订单号和凭证)并发送至服务器。

  18. 服务器将数据发给App Store来验证该交易的有效性。(主要是凭证的验证)具体可以查看https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Introduction.html#//apple_ref/doc/uid/TP40010573

  19. App Store对收到的数据进行解析,返回该数据和说明其是否有效的标识。

  20. 服务器读取返回的数据,确定用户购买的内容。

  21. 服务器确认成功后告诉客户端。
    漏单问题 需要注意的是因为订单是和服务器保持同步的,但是购买流程在客户端,所有因为网络等问题会出现,漏单的问题,所以每次购买成功后需要本地保存一份凭证,只有当服务端验证通过后才从本地删掉,另外换需要在程序启动后在合适的时机检测是否有未处理的凭证,如果有需要给服务端验证。

相关链接 https://developer.apple.com/in-app-purchase/
官方demo
https://developer.apple.com/library/content/samplecode/sc1991/Introduction/Intro.html#//apple_ref/doc/uid/DTS40014726

参考 http://allluckly.cn/ios支付/iOS开发2015年最新内购教程

二、PHP端处理

 

说明: 1、根据前端传过来的购买凭证,服务器发请求去苹果验证,验证凭证是否有效。

2、如果凭证有效,还有验证凭证是否被验证过,凭证只能成功被验证一次(防止伪造请求刷单,比如用一次成功的凭证和多次失败的订单号来构造请求)。

3、通过苹果返回的数据,检查产品Id是否匹配。 上面三个验证都通过了才认为有效、成功的购买。

客户端要有失败重试机制,防止网络断掉或者其他异常导致验证请求发送失败,进而导致丢单现象(用户的钱花了,但是在我们平台上并没有购买/充值成功)

  1. 传递参数

  2. {

  3. "voucher":2 //凭证号

  4. "order_id": 1, // 订单id

  5. }

  6. 返回

  7. {

  8. "code":200,

  9. "msg":"success,

  10. "data":{

  11. "voucher":100 //凭证号,

  12. "order_id": 333 //订单号

  13. }

  14. }

  15.  

  16. // 苹果充值验证 这里只是处理类的几个方法

  17.    public function anyAppleVerify(Request $request)

  18.    {

  19.        $userId = $request->input('user_id',0);

  20.  

  21.        $verifyUrlSandbox = 'https://sandbox.itunes.apple.com/verifyReceipt'; // 沙盒测试

  22.        $verifyUrl = 'https://buy.itunes.apple.com/verifyReceipt'; // 正式服务

  23.  

  24.        $voucher = $request->input('voucher', '');

  25.        $orderId = $request->input('order_id', '1');

  26.        if (empty($voucher)) {

  27.            return [ 'code' => 10086, 'msg' => '凭证不能为空'];

  28.        }

  29.  

  30.        // 验证凭证是否有效https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

  31.  

  32.        $purchaseInfo = $this->doAppleVerify($verifyUrl, $voucher);

  33.        if($purchaseInfo->status == 21007){ //走沙盒验证 测试环境

  34.            $purchaseInfo = $this->doAppleVerify($verifyUrlSandbox, $voucher);

  35.        }

  36. $order = $purchaseInfo ->receipt->in_app;//所有的订单的信息

  37. if ($purchaseInfo->status != 0) {

  38.   return ['code' => 400, 'msg' => '购买凭证验证失败'];//更新订单状态

  39. }

  40. }

  41. protected function doAppleVerify($verificationUrl, $receipt){

  42.        $postData = ['receipt-data' => $receipt];

  43.        $postData = json_encode($postData);

  44.        $purchaseInfoStr = Common::CurlRequest($verificationUrl, $postData);

  45.        $purchaseInfo = json_decode($purchaseInfoStr);

  46.  

  47.        return $purchaseInfo;

  48.    }

  49. public static function CurlRequest($url, $data = '', $timeOut = 60)

  50.    {

  51.        $curl = curl_init();

  52.        curl_setopt($curl, CURLOPT_URL, $url);

  53.        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

  54.        curl_setopt($curl, CURLOPT_HEADER, 0);

  55.        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);

  56.        curl_setopt($curl, CURLOPT_POST, 1);

  57.        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

  58.        curl_setopt($curl, CURLOPT_TIMEOUT, $timeOut);

  59.        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

  60.  

  61.        $time = microtime(true);

  62.        $resultData = curl_exec($curl);

  63.        if (($time = microtime(true) - $time) > 1) {

  64.            Log::warning("Slow curl \"POST {$url}\".", ['time' => number_format($time, 2)]);

  65.        }

  66.  

  67.        if (curl_errno($curl)) {

  68.            Log::warning("Curl failed \"POST {$url}\", " . curl_error($curl), ['time' => number_format($time, 2)]);

  69.  

  70.            curl_close($curl);

  71.            return false;

  72.        } else {

  73.            curl_close($curl);

  74.  

  75.            return $resultData;

  76.        }

  77.    }


简单总结起来就是:支付时生成一个订单id返回给 ios ,然后 ios 调用苹果支付产生一个凭证号,之后将支付成功后的订单和凭证号传递给服务端校验是否支付成功。

 

 



这篇关于苹果支付 PHP 服务端处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程