Google内购 Java服务端(Springboot)校验订单详细流程

因为产品需要接入Google支付,这里记录一下进行Java服务端校验的过程。

一、 Google Pay主要支付流程

1.手机端向Java服务端发起支付,生成预订单,给手机端返回生成的订单号

2.手机端向Google发起支付(传入本地服务器生成的订单号)

3.Google服务器将支付结果返回给手机端

4.手机端向Java服务端发送校验请求,校验通过后即可处理订单

二、前提条件

1.一台海外服务器(国内服务器请求Google服务器进行校验会出现请求超时的问题)

2.接入Google服务的手机客户端

3.浏览器能访问Google Paly控制台

三、Google Paly控制台准备

1.进入Google控制台,选择开发者者账号登陆。

2.进入api权限设置,初始状态是没有的(我这里是已经创建了),直接创建一个新的项目就可以了。

3.给该api服务创建一个服务账号

4.按照弹窗的提示进行操作

5.点击创建一个服务账号

6.写好必填的名称即可直接点击完成

7.点击进入刚刚创建好的账号(可以复制一下,等等添加权限的时候需要粘贴过去),选择添加密钥

8.选择Json格式,点击创建,然后保存好生成的Json文件

9.回到控制台,给刚刚创建好的服务账号添加权限

10.邀请刚刚添加的服务账户并授权后完成邀请

11.进入应用的商品页面,重新保存一下商品(修改一下描述信息,然后修改回来即可),不然请求Google服务器进行校验时,会出现401没有用户没有api权限的问题!!!!!!

至此完成了控制台的准备工作

三、Java服务端处理

前提条件,需要在海外服务器才能成功调取Google Api否则会出现超时的情况

maven依赖:

        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-androidpublisher</artifactId>
            <version>v3-rev24-1.24.1</version>
        </dependency>

校验代码:

@RestController
public class GoogleController {

    //    packageName为应用程序包名、productId商品id、purchaseToken谷歌返回的收据
    @PostMapping("/")
    public ProductPurchase checkOrder(@RequestBody GooglePayDto googlePayDto,
                              HttpServletRequest requestDto) throws IOException, GeneralSecurityException {
        //使用服务帐户Json文件获取Google凭据
        List<String> scopes = new ArrayList<>();
        scopes.add(AndroidPublisherScopes.ANDROIDPUBLISHER);
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        Resource resource = resourceLoader.getResource("classpath:static/刚下载的json文件,这里放到了static目录下");
        GoogleCredential credential = GoogleCredential.fromStream(resource.getInputStream())
                .createScoped(scopes);
//        使用谷歌凭据和收据从谷歌获取购买信息
        HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        JacksonFactory jsonFactory = new JacksonFactory();
        AndroidPublisher publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential)
                .setApplicationName("应用程序名").build();
        AndroidPublisher.Purchases purchases = publisher.purchases();
        final AndroidPublisher.Purchases.Products.Get request = purchases.products().get(googlePayDto.getPackageName(), googlePayDto.getProductId(),googlePayDto.getPurchaseToken());
        System.out.println("==============="+request+"================");
        final ProductPurchase purchase = request.execute();
        //处理业务
        return purchase;
    }
}
public class GooglePayDto {

    String packageName;
    String productId;
    String purchaseToken;

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getPurchaseToken() {
        return purchaseToken;
    }

    public void setPurchaseToken(String purchaseToken) {
        this.purchaseToken = purchaseToken;
    }
}

四、测试

前台传入三个参数

packageName:包名

productId:商品id

purchaseToken:支付凭证

结果:

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是一个简单的 Java 实现苹果内购凭证校验的代码示例: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; public class AppleIAPValidator { private static final String SANDBOX_URL = "https://sandbox.itunes.apple.com/verifyReceipt"; // 沙盒环境 private static final String PRODUCTION_URL = "https://buy.itunes.apple.com/verifyReceipt"; // 正式环境 private static final String PASSWORD = "your_shared_secret"; // 共享密钥 public static boolean validateReceipt(String receiptData, boolean isSandbox) throws Exception { String urlString = isSandbox ? SANDBOX_URL : PRODUCTION_URL; URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); String json = "{\"receipt-data\" : \"" + receiptData + "\", \"password\" : \"" + PASSWORD + "\"}"; writer.write(json); writer.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { builder.append(line); } String response = builder.toString(); System.out.println(response); // 打印校验结果 // 解析校验结果,判断收据是否有效 // 此处代码省略,可以根据返回的 status 判断校验结果 // 如果 status 是 0,则表示验证成功,收据有效;否则收据无效 return true; } public static void main(String[] args) { String receiptData = "your_receipt_data"; // 收据数据,可以从客户端获取 try { String base64ReceiptData = Base64.getEncoder().encodeToString(receiptData.getBytes("UTF-8")); boolean isSandbox = true; // 是否是沙盒环境,根据实际情况设置 validateReceipt(base64ReceiptData, isSandbox); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们定义了一个 `AppleIAPValidator` 类,其中包含了一个 `validateReceipt` 方法,用于校验苹果内购凭证。该方法接受两个参数:`receiptData` 表示收据数据,`isSandbox` 表示是否是沙盒环境。 在方法内部,我们首先根据 `isSandbox` 参数选择要使用的校验地址,然后将收据数据和共享密钥组装成一个 JSON 字符串,并发送 POST 请求到苹果服务器。服务器返回的校验结果是一个 JSON 字符串,我们可以根据其中的 `status` 字段判断收据是否有效。 在 `main` 方法中,我们定义了一个收据数据 `receiptData`,然后将它进行 Base64 编码,并调用 `validateReceipt` 方法进行校验。如果校验结果是有效的,那么方法将返回 `true`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值