zoukankan      html  css  js  c++  java
  • 苹果支付

    1、配置苹果内购项目

    https://help.apple.com/app-store-connect/#/devb57be10e7

    • APP store 配置APP项目

    • 项目下添加内购项目

    • 添加沙盒测试账号

    2、返回数据 前端调起苹果支付

           log.info("=========================苹果支付-添加交易记录=======================");
                //根据自己的业务 生成订单
                insertPayRecord(orderSn, appUser.getAppUserId(), appUser.getNickName(), PayRecordPayType.PAY_TYPE3.getCode(),
                        buyPhotoAlbumDTO.getPayMode(), PayRecordPayStatus.PAY_STATUS1.getCode(),
                        albumMoney, String.valueOf(buyPhotoAlbumDTO.getAlbumNumber()), null, null);
                //将苹果配置的productId传给前端
                String productId = "";
                switch(buyPhotoAlbumDTO.getAlbumNumber()){
                    case 1:
                        productId = AppleProductId.BUY_ALBUM_1.getProductId();
                        break;
                    case 2:
                        productId = AppleProductId.BUY_ALBUM_2.getProductId();
                        break;
                }
    			//*****可以自行添加参数*****
                ApplePayVO applePayVO = new ApplePayVO();
                applePayVO.setOrderSn(orderSn);	//添加订单id
                applePayVO.setProductid(productId);
                return Result.ok(applePayVO);
    

    3、苹果支付回调

    前端根据productId调用苹果支付,支付成功后前端得到payload,前端将订单id和payload作为入参调用苹果支付回调接口。

    payload:

    {
        "status":0,
        "environment":"Sandbox",
        "payment":{
            "username":"admin"
        },
        "receipt":{
            "receipt_type":"ProductionSandbox",
            "adam_id":0,
            "app_item_id":0,
            "bundle_id":"com.jiuying.twelveAnimal",
            "application_version":"0",
            "download_id":0,
            "version_external_identifier":0,
            "receipt_creation_date":"2018-01-05 10:06:12 Etc/GMT",
            "receipt_creation_date_ms":"1515146772000",
            "receipt_creation_date_pst":"2018-01-05 02:06:12 America/Los_Angeles",
            "request_date":"2018-01-05 10:06:14 Etc/GMT",
            "request_date_ms":"1515146774645",
            "request_date_pst":"2018-01-05 02:06:14 America/Los_Angeles",
            "original_purchase_date":"2013-08-01 07:00:00 Etc/GMT",
            "original_purchase_date_ms":"1375340400000",
            "original_purchase_date_pst":"2013-08-01 00:00:00 America/Los_Angeles",
            "original_application_version":"1.0",
            "in_app":[
                {
                    "quantity":"1",
                    "product_id":"com.jiuying.twelveAnimal.6",
                    "transaction_id":"1000000364151484",
                    "original_transaction_id":"1000000364151484",
                    "purchase_date":"2018-01-05 10:06:11 Etc/GMT",
                    "purchase_date_ms":"1515146771000",
                    "purchase_date_pst":"2018-01-05 02:06:11 America/Los_Angeles",
                    "original_purchase_date":"2018-01-05 10:06:11 Etc/GMT",
                    "original_purchase_date_ms":"1515146771000",
                    "original_purchase_date_pst":"2018-01-05 02:06:11 America/Los_Angeles",
                    "is_trial_period":"false"
                }
            ]
        }
    }
    

      前端将订单id和payload作为入参调用苹果支付回调接口

    回调接口

    public Result applePayOrderNotifyCallBack(String orderSn, String payload) {
            try {
                // 支付凭证
                JSONObject job1 = JSONObject.parseObject(payload);
                String receipt = job1.getString("transactionReceipt");
    
                // 读取自己添加的参数 订单号orderSn
                String payment = job1.getString("payment");
                JSONObject paymentJob = JSONObject.parseObject(payment);
                String transaction_id = paymentJob.getString("orderSn");
    
                String verifyResult = IosVerifyUtil.buyAppVerify(receipt, 1);	//1.先线上测试    发送平台验证
                if (verifyResult == null) {     // 苹果服务器没有返回验证结果
                    log.info("无订单信息!");
                    return Result.error(ServiceErrCode.ORDER_NOT_FOUND);
                } else {  	    				// 苹果验证有返回结果
                    log.info("线上,苹果平台返回JSON:" + verifyResult);
                    JSONObject job = JSONObject.parseObject(verifyResult);
                    String states = job.getString("status");
                    //0 正常
                    //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环境的验证服务
                    if("21007".equals(states)){				//是沙盒环境,应沙盒测试,否则执行下面
                        verifyResult = IosVerifyUtil.buyAppVerify(receipt, 0);	//2.再沙盒测试  发送平台验证
                        log.info("沙盒环境,苹果平台返回JSON:" + verifyResult);
                        job = JSONObject.parseObject(verifyResult);
                        states = job.getString("status");
                    }
    
                    log.info("苹果平台返回值:job" + job);
                    if (states.equals("0")){ // 前端所提供的收据是有效的    验证成功
                        String r_receipt = job.getString("receipt");
                        JSONObject returnJson = JSONObject.parseObject(r_receipt);
    
                        String product_id = returnJson.getString("product_id");
    //                    String transaction_id = returnJson.getString("transaction_id");   // 订单号
    
    /*****************************************自己的业务逻辑开始*********************************************/
                        //如果单号一致  则开始处理逻辑
                        if(orderSn.equals(transaction_id)){
                            String[] moneys = product_id.split("\.");      //实际支付金额
                            //此处开始业务逻辑
                            payNotifyUpdateOrder(orderSn);  //回调成功 处理订单
                            return Result.ok("操作成功");
                        }
                        return Result.error(ServiceErrCode.RECEIPT_ERROR);
    /*************************************自己的业务逻辑结束***************************************************/
                    } else {
                        return Result.error(ServiceErrCode.RECEIPT_ERROR);
                    }
                }
            } catch (Exception e) {
                log.error("苹果支付回调失败");
            }
            return Result.ok("操作成功");
        }
    

      

  • 相关阅读:
    语音转写平台-非实时语音分割
    基于能量或过零率的实时语音分割--学习笔记
    web浏览器录音:web audio api
    python---webRTC~vad静音检测-学习笔记
    python import自己写的.py文件
    许愿墙JQ
    抽奖JQ
    制作时钟
    冒泡排序
    企业面试:作用域和函数提升的面试题
  • 原文地址:https://www.cnblogs.com/csyzlm/p/14048307.html
Copyright © 2011-2022 走看看