


PHP handles the secondary verification on the server after in-app purchases in Apple APP (project experience)
The content of this article is about the PHP project integrating WeChat code scanning payment API (domestic payment). It has a certain reference value. Now I share it with you. Friends in need can refer to it
1. Apple APP payment to server verification process
1. The user clicks to purchase in the app;
2. The app calls the server interface to generate an order;
3. The payment window pops up after the app obtains the server order and successfully generates it;
4. The user enters the password to pay;
5. After the app receives the payment, the apple application The payment voucher returned by the store;
6. The app transmits the payment voucher back to the server and calls the server interface to verify whether the voucher is valid;
7. The app obtains the server-side verification result , feedback the user’s payment result status.
Instructions: For products paid by Apple, you need to configure the APP in-app purchase item in itunes Connect first. After configuration, a product ID will be generated correspondingly. On the Apple APP side When calling Apple Pay, you need to send the product ID (product_id) parameter to the Apple store. Then the payment process is carried out in the Apple Store. After the payment is completed, a payment voucher is returned to the APP, indicating that the payment is completed, but generally it will call its own server (merchant server) again for payment verification. At this time, write a verification interface on the server , determine whether the voucher is valid, and if valid, modify the order status and purchased product status accordingly, etc.
2. Credential verification function
/** * 验证AppStore内付 * @param string $receipt_data 付款后凭证 * @return array 验证是否成功 */ function validate_apple_pay($receipt_data) { /** * 21000 App Store不能读取你提供的JSON对象 * 21002 receipt-data域的数据有问题 * 21003 receipt无法通过验证 * 21004 提供的shared secret不匹配你账号中的shared secret * 21005 receipt服务器当前不可用 * 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送 * 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务 * 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务 */ function acurl($receipt_data, $sandbox=0){ //小票信息 $secret = "XXXXXXXXXXXXXXXXXXXX"; // APP固定密钥,在itunes中获取 $POSTFIELDS = array("receipt-data" => $receipt_data,'password'=>$secret); $POSTFIELDS = json_encode($POSTFIELDS); //正式购买地址 沙盒购买地址 $url_buy = "https://buy.itunes.apple.com/verifyReceipt"; $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt"; $url = $sandbox ? $url_sandbox : $url_buy; //简单的curl $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS); $result = curl_exec($ch); curl_close($ch); return $result; } // 验证参数 if (strlen($receipt_data)<20){ $result=array( 'status'=>false, 'message'=>'非法参数' ); return $result; } // 请求验证 $html = acurl($receipt_data); $data = json_decode($html,true); // 如果是沙盒数据 则验证沙盒模式 if($data['status']=='21007'){ // 请求验证 $html = acurl($receipt_data, 1); $data = json_decode($html,true); $data['sandbox'] = '1'; } if (isset($_GET['debug'])) { exit(json_encode($data)); } // 判断是否购买成功 if(intval($data['status'])===0){ $result=array( 'status'=>true, 'message'=>'购买成功' ); }else{ $result=array( 'status'=>false, 'message'=>'购买失败 status:'.$data['status'] ); } return $result; }
Note: There is a key in the verification function that needs to be obtained from itunes.
3. Application demonstration (ThinkPHP3.2 controller)
public function verify() { // 获取订单号 $order_no = I('post.order_no'); // 获取用户id $user_id = I('post.uid'); //苹果内购的验证收据 $apple_receipt = I('post.apple_receipt'); // 判断是否缺少参数 if ( empty($order_no) || empty($user_id) || empty($apple_receipt) ) { $message = "缺少请求参数"; $status = "400"; } else { // 代码思路 // 1. 判断订单是否存在并且有效 // 2. 判断用户是否存在 // 3. 调用苹果支付凭证验证函数 $verify_result = validate_apple_pay($apple_receipt); // 4.判断验证结果 if( $apple_result['status'] ) { // 凭证验证成功 // 其他code,修改订单状态、购买商品状态…… $message = "ok"; $status = "200"; } else { // 凭证验证失败 $status = "401"; $message = "验证失败"; } } // 返回接口数据 $result = array(); if( !empty($apple_receipt) ) { $result['verify_result'] = $verify_result['message']; $result['apple_receipt'] = $apple_receipt; } $result['status'] = $status; $result['message'] = $message; $this->response($result,'json'); //以json方式返回数据 }
4. Reference documents
1. HTTP standard Status code;
2. Apple in-app purchase project configuration process;
3. iOS in-app payment (IAP) detailed explanation
Related recommendations:
PHP handles WeChat SDK intercepted photo uploads
The above is the detailed content of PHP handles the secondary verification on the server after in-app purchases in Apple APP (project experience). For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.
