Java接入内购 Apple Pay、Google Play

这篇具有很好参考价值的文章主要介绍了Java接入内购 Apple Pay、Google Play。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java内购接入Apple Pay、Google play

内购流程:

  1. 客户端向服务器发起请求生成预订单,服务器校验后生成预订单返回客户端。若调起支付界面后未支付,则通知服务器取消本订单。
  2. 客户端拿到预订单号后,在玩家完成付款操作后,携带预订单号请求支付平台,将预订单号存储在支付平台中,并获取支付凭证。
  3. 客户端携带支付凭证请求服务器,服务器携带支付凭证向支付平台请求
  4. 服务器收到支付平台的回值后,从回值中获取订单的支付状态和预订单号,并通过预订单号定位玩家具体购买的商品信息。
  5. 服务器返回客户端校验信息,客户端通知支付平台本单已结束

内购失败处理方式:

  1. 校验失败(网络波动,支付平台状态更新异常,玩家使用重复支付凭证)则先存储校验时需要的参数,例如,支付凭证,transactionId等信息,存储在数据库和ck中
  2. 在后台中创建定时,限次数的进行后台校验。重新携带参数请求支付平台,若校验通过,则通过邮件形式向玩家发邮件进行补偿。在达到校验最大次数后仍未通过校验,则此单不再参与后台自动校验。
  3. 未通过校验的玩家可以通过联系客服进行再次校验。客服可以通过远程脚本手动查看支付平台返回的校验信息,核实后向玩家发邮件补偿,并手动记录在ck中。

客户端逻辑:

客户端先向支付平台请求正在支付的列表,若存在未完成到订单,则像服务器发送校验请求,直到服务器向客户端返回信息,客户端会向支付平台发起结束本订单的请求,完成完整的一次内购。

校验代码:

Apple Pay:
public AppleResponseData getIosOrderId(String transactionId, String url) {
    try {
      Map<String, Object> header = new HashMap<>();
      header.put("alg", "ES256");
      header.put("kid", new String(Base64.getDecoder().decode(iosKid.getBytes())));
      header.put("typ", "JWT");
      Map<String, Object> claims = new HashMap<>();
      claims.put("iss", new String(Base64.getDecoder().decode(iosIss.getBytes())));
      claims.put("iat",  Math.floor(System.currentTimeMillis() / 1000));
      claims.put("exp", Math.floor(System.currentTimeMillis() / 1000) + 1800);
      claims.put("aud", "appstoreconnect-v1");
      claims.put("bid", iosBid);
      //从p8文件获取的秘钥 此处为了方便演示直接使用的字符串,建议从p8文件中读取,确保安全性
      String key = iosPrivateKey;

      PrivateKey privateKey = null;
      //ES256无法使用Base64加密的秘钥来生成jwt 必须解码
      KeyFactory kf = KeyFactory.getInstance("EC");
      privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(key)));
      //生成jwt
      String token = Jwts.builder()
          .setHeader(header)
          .setClaims(claims)
          .signWith(SignatureAlgorithm.ES256, privateKey)
          .compact();
      SSLContext sc = SSLContext.getInstance("SSL");
      sc.init(null, new TrustManager[]{new TrustAnyTrustManager()},
          new java.security.SecureRandom());
      URL console = new URL(url + transactionId);
      HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
      conn.setSSLSocketFactory(sc.getSocketFactory());
      conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
      conn.setRequestMethod("GET");
      conn.setRequestProperty("content-type", "text/json");
      conn.setRequestProperty("Proxy-Connection", "Keep-Alive");
      conn.setRequestProperty("Authorization", "Bearer "+ token);
      conn.setDoInput(true);
      conn.setDoOutput(true);
      conn.setConnectTimeout(3000);
      InputStream is = conn.getInputStream();
      BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      String line = "";
      StringBuilder sb = new StringBuilder();
      while ((line = reader.readLine()) != null) {
        sb.append(line);
      }
      JSONObject jsonObject = JSONObject.parseObject(sb.toString());
      LogUtil.trace("ios支付回值:" + jsonObject);
      String jwsTransactionBase64 = jsonObject.getString("signedTransactionInfo").split("\\.")[1];
      String jwsTransactionBase = new String(Base64.getDecoder().decode(jwsTransactionBase64));
      AppleResponseData appleResponseData = JSONObject.parseObject(jwsTransactionBase, new TypeReference<AppleResponseData>() {});
      return appleResponseData;
    } catch (Exception e) {
      CommonLogUtil.error(e.getMessage(), e);
    }
    return null;
  }

接收类:

public class AppleResponseData {

  //服务器uuid
  private String appAccountToken;

  //应用包名
  private String bundleId;

  private String currency;

  //沙盒或者正式环境
  private String environment;

  //购买时间
  private long originalPurchaseDate;

  //产品id
  private String productId;

  //唯一标识
  private String transactionId;
}

官方文档: https://developer.apple.com/documentation/appstoreserverapi/get_transaction_history

需要参数:

  1. transactionId:支付完成后客户端从IOS平台获取的支付凭证。
  2. url:服务器校验地址,
    沙盒:https://api.storekitsandbox.itunes.apple.com/inApps/v1/transactions/ (+ transactionId)
    正式:https://api.storekit.itunes.apple.com/inApps/v1/history/ (+ transactionId)
  3. kid:密钥id
  4. iss:issuer ID
  5. bid:应用名称,例如 com.company.production
  6. privateKey:已授权账号在ios官网下载的p8文件中的内容
    java服务端对接applepay,java,maven
Google Play:
public ProductPurchase googlePlayPayRequest(String productId, String purchaseToken,
      String packageName) {

    try {
      openTemProxy();
      List<String> scopes = new ArrayList<>();
      scopes.add(AndroidPublisherScopes.ANDROIDPUBLISHER);
      StringInputStream stringInputStream = new StringInputStream(new String(Base64.getDecoder().decode(googleVerifyJson)));
      GoogleCredential credential = GoogleCredential.fromStream(stringInputStream)
          .createScoped(scopes);
      //设置过期时间
      credential.setExpirationTimeMilliseconds(3000L);
      HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
      JsonFactory jsonFactory = new JacksonFactory();
      AndroidPublisher publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory,
          credential).build();
      AndroidPublisher.Purchases purchases = publisher.purchases();
      final AndroidPublisher.Purchases.Products.Get request = purchases.products()
          .get(packageName, productId, purchaseToken);
      return request.execute();
    } catch (Exception e) {
      LogUtil.info(e.getMessage(), e);
    } finally {
      Properties systemProperties = System.getProperties();
      if(openProxy){
        systemProperties.clear();
      }
    }
    return null;
  }

  /**
  * 开启代理
  */
  public void openTemProxy() {
    if(true){
      //代理端口
      try {
        Properties systemProperties = System.getProperties();
        systemProperties.setProperty("http.proxyHost", "127.0.0.1");
        systemProperties.setProperty("http.proxyPort", "7890");
        systemProperties.setProperty("https.proxyHost", "127.0.0.1");
        systemProperties.setProperty("https.proxyPort", "7890");
        systemProperties.setProperty("socksProxyHost", "127.0.0.1");
        systemProperties.setProperty("socksProxyPort", "7890");
        systemProperties.setProperty("http.nonProxyHosts", "localhost");
        systemProperties.setProperty("https.nonProxyHosts", "localhost");

      } catch (Exception e) {
        CommonLogUtil.error(e.getMessage(), e);
      }
    }
  }

maven:

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

    <dependency>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-oauth2-http</artifactId>
      <version>1.3.0</version>
    </dependency>

官方文档: https://developers.google.cn/android-publisher/api-ref/rest/v3/purchases.products?skip_cache=true&hl=zh-cn

需要参数:

  1. productId: 产品id
  2. purchaseToken: 购买凭证
  3. packageName: 项目名称
  4. verifyJson: google后台获取授权账号json文件

google授权文档: https://www.quicksdk.com/doc-516.html文章来源地址https://www.toymoban.com/news/detail-853812.html

到了这里,关于Java接入内购 Apple Pay、Google Play的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity接入IAP内购(Android,IOS)最新流程,第一篇:内购接入

    你好! 这将是一个系列的文章 第一篇 介绍客户端里支付的调起以及购买。 第二篇 介绍后台对购买结果的验证以及发货(IOS)。 第三篇 介绍后台对购买结果的验证以及发货(Android)。 第四篇 介绍后台对内购退单问题的处理(IOS欺诈检测以及欺诈信息反馈)。 我们是用的

    2024年04月13日
    浏览(45)
  • Unity接入IAP、服务器验单(Google Play)

    最近因为项目需要,被分配来做项目SDK接入以及上架相关事宜。搞了好几天关于Unity接入支付的SDK,接入很简单,卡的最久的就是服务器验单,google相关文档也不是很全,走通之后觉得可以发出来共享一下,第一次写文章,有什么不足多多见谅 Unity已经集成了Google Pay、Apple

    2023年04月11日
    浏览(44)
  • Unity 之 接入IOS内购过程解析【文末源码】

    看完此文章你可以了解IOS内购接入全过程,可以学习到Unity从零接入内购功能。另外此博文和文末源码没有涉及到掉单补单部分逻辑。 一台mac系统机器 苹果开发者账号 Unity2019.4.x (不同版本,3步骤略有不同) Xcode (我的版本12.5) PS:若公司已有运营人员在后台操作过了,可以

    2023年04月17日
    浏览(29)
  • 【Unity】Unity接入内购IAP,提示you are not authorized to set the license key

    接入IAP的时候需要输入谷歌的开发者后台key Unity2020之后有可能会提示:you are not authorized to set the license key 查阅相关内容后(https://forum.unity.com/threads/purchase-you-are-not-authorized-to-set-the-license-key-google-play.954261/) Unity2020后不在Editor上面填写了,改成在Dashboard上输入 打开后输入即

    2024年02月08日
    浏览(47)
  • Apple Unity Plugins 接入GameCenter 崩溃解决方案

    调用 GKLocalPlayer.Local.FetchItems() 程序崩溃,报错: Thread 1: EXC_BAD_ACCESS (code=257, address=0x8000000000000002) 启动崩溃,报错: Library not loaded: @rpath/AppleCoreNative.framework/AppleCoreNative 苹果官方提供的库,直接编译后,会在调用 GKLocalPlayer.Local.FetchItems() 时崩溃。 https://github.com/apple/unityplu

    2024年01月16日
    浏览(36)
  • 安卓接入Google登录

    目录 1.配置Google Cloud 2.添加 Google Play 服务 3.添加Google sign代码 4.常见的CommonStatusCodes 后补Web clien(Auto-created for Google Sign-in)由来         首先要在 Google Cloud 中创建一个项目。左侧菜单-API和服务-凭据。进入之后先配置同意屏幕。   填写必必要的信息,应用名称、用户支持电子

    2024年02月01日
    浏览(39)
  • Unity接入Google登录,踩坑

    记录不明坑 根据大佬们写的文章Unity接入Google登录超详细流程接入Google,但是在导入安卓依赖管理插件EDM4U后,却疯狂报错。 刚开始是: Assembly \\\'Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.157.dll\\\' will not be loaded due to errors: Assembly name \\\'Google.VersionHandlerImpl\\\' does not matc

    2024年02月05日
    浏览(36)
  • ios swift5 “Sign in with Apple“(使用苹果登录)怎样接入(第三方登录)集成AppleID登录

    1.1 如果你新建app id,记得在新建的时候就选中Sign in with Apple功能 1.2 如果app已经上线了,后面再需要加苹果登录的功能,也可以在app id的配置中加这个功能,只是勾选Sign in with Apple点击Save后,profilex需要重新生成 iOS 苹果登录(第三方登录) - csdn 集成AppleID登录 - 简书 要在你的

    2024年04月09日
    浏览(64)
  • Unity接入Google登录超详细流程

    1、unity版本:2021.3.21f1 特别说明:通过Unityhub安装的Unity,需要安装对应版本所需的JDK、SDK、NDK,我们默认使用Unity自带的,不需要使用自己下载的,否则可能会导致打包失败的问题。 2、google登录sdk版本:GoogleSignIn_v1.0.4.1 特别说明: (1)GoogleSignIn官方插件地址是:GoogleSignIn,但

    2024年02月09日
    浏览(47)
  • 安卓接入google的Firebase登录教程

    1.https://console.firebase.google.com创建安卓项目                 2.添加google登录              3.添加项目的SHA证书指纹                       4. FireBase自动生成(API和服务)   https://console.cloud.google.com/apis/credentials?authuser=1project=battle-against-darkness            5.下载google-s

    2024年01月21日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包