华为支付国内版接入流程

2022-05-03  本文已影响0人  xq9527

前言:

各位同学大家好,有段时间没有见面了哈 具体多久 我也记不清楚了。 今天因为公司这边业务 需要接入华为支付。所以就记录一些笔记

需要用到的三方库

    implementation 'com.huawei.hms:iap:6.1.0.300'
    implementation 'com.zhy:okhttputils:2.6.2'
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'

构造PurchaseIntentWithPriceReq对象

        // 构造PurchaseIntentWithPriceReq对象
        PurchaseIntentWithPriceReq req = new PurchaseIntentWithPriceReq();
        req.setCurrency("CNY");
        req.setDeveloperPayload("test");
     // priceType: 0: 消耗型; 1: 非消耗型
        req.setPriceType(0);
        req.setSdkChannel("1");
        req.setProductName("test");
        req.setAmount("0.01");
        req.setProductId("ConsumableProduct1");
        req.setServiceCatalog("XXX");
        req.setCountry("CN");

调起支付

   // 获取调用接口的Activity对象
        final Activity activity = MainActivity.this;
          // 调用createPurchaseIntentWithPrice接口
        Task<PurchaseIntentResult> task = Iap.getIapClient(activity).createPurchaseIntentWithPrice(req);
        task.addOnSuccessListener(new OnSuccessListener<PurchaseIntentResult>() {
            @Override
            public void onSuccess(PurchaseIntentResult result) {

                Log.e(TAG, "onSuccess: "+"支付成功" );
                // 获取支付结果
                String paymentData = result.getPaymentData();
                String paymentSignature = result.getPaymentSignature();
                Status status = result.getStatus();
                Log.e(TAG, "onSuccess: "+status.hasResolution());
                if (status.hasResolution()) {
                    try {
                        status.startResolutionForResult(activity, 6666);
                    } catch (IntentSender.SendIntentException exp) {
                    }
                }

                // 验证paymentData的签名
                String publicKey = "MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA4bxZvl8ChRh/jkPK8HpC0QI4eA094ukIbxhZMTgnsi9OJ8h5sGTy6HYHsh/yr7+ZlEe6T2+dVNwESTcM/q1GsgNUnNnnwXDhjKkDOaiQp8+GilD+JFujC+khwhmGrRbKUvIqhUs6DgFx6B7X116qcUKUBKaIRFTuWbNEhIQHQ6Z6++nQnz6vDaa4/CG05CE+Hms/63iZe3qNXl9Nf2PST6iM00E2q4aEmZzthwDGP1ll6KD0y/Aj+6lFbUyxX+3FgTSSU2ma4rqiQtGZ+GOK9mijfu7FjGKDvn+qRX+prQypGGkVdlggRcq1vpCEqsDNt/giQuvnHgA8x5eQul8hre/UquVAHwj4bWpRQ3EFuK9QuV9I2GlDMqfPVKwXwuLeSVMHpG2qbIToc5ZldSSMMkQ40lbHpjHgex3J1Dukl+0WGX4FzkPRUP6AB6YEY8KQEx7vH0yvdiuc6tCATTIR1RDcd1EIs/08zEJHsJgfGbcLajbbU3CTb7LY5YEzXlalAgMBAAE=";
                // CipherUtil为自定义类,需要自定义doCheck方法
             /*   if (CipherUtil.doCheck(paymentData, paymentSignature, publicKey)) {
                    // 如果成功,则启动请求返回的IAP收银台页面
                    Status status = result.getStatus();
                    Log.e(TAG, "onSuccess: "+status.hasResolution());
                    if (status.hasResolution()) {
                        try {
                            status.startResolutionForResult(activity, 6666);
                        } catch (IntentSender.SendIntentException exp) {
                        }
                    }
                }*/
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                if (e instanceof IapApiException) {
                    IapApiException apiException = (IapApiException) e;
                    int returnCode = apiException.getStatusCode();
                    switch (returnCode) {
                        case OrderStatusCode.ORDER_HWID_NOT_LOGIN:
                        case OrderStatusCode.ORDER_NOT_ACCEPT_AGREEMENT:
                            // 帐号未登录或用户不同意支付协议
                            Status status = apiException.getStatus();
                            if (status != null && status.hasResolution()) {
                                try {
                                    status.startResolutionForResult(activity, 8888);
                                } catch (IntentSender.SendIntentException exp) {
                                }
                            }
                            break;
                        case OrderStatusCode.ORDER_PRODUCT_OWNED:
                            // 检查是否存在未交付的商品
                            break;
                        default:
                            break;
                    }
                }
            }
        });

支付回调


    // 支付结果回调
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 6666) {
            if (data == null) {
                Log.e("onActivityResult", "data is null");
                return;
            }
            PurchaseResultInfo purchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data);
            switch(purchaseResultInfo.getReturnCode()) {
                case OrderStatusCode.ORDER_STATE_CANCEL:
                    // 用户取消支付
                    break;
                case OrderStatusCode.ORDER_STATE_FAILED:
                case OrderStatusCode.ORDER_STATE_DEFAULT_CODE:
                case OrderStatusCode.ORDER_PRODUCT_OWNED:
                    // 检查是否存在未交付的商品
                    break;
                case OrderStatusCode.ORDER_STATE_SUCCESS:
                    // 支付成功
                    String inAppPurchaseData = purchaseResultInfo.getInAppPurchaseData();
                    String inAppPurchaseDataSignature = purchaseResultInfo.getInAppDataSignature();
                    // 使用您应用的IAP公钥验证签名
                    // 若验签成功,则进行发货
                    // 若用户购买商品为消耗型商品,您需要在发货成功后调用consumeOwnedPurchase接口进行消耗
                    // 支付消耗逻辑


                    payConsume(inAppPurchaseData);
                    //支付互调 需要自行完善
                    Map<String,String>map=new HashMap<>();
                    map.put("order_id","");
                    map.put("hw_order_id","");
                    map.put("money","");
                     map.put("game_id","");
                    map.put("hw_sign","");
                    map.put("hw_source","");
                    map.put("sandbox","");
                    payCallback(map);

                    break;
                default:
                    break;
            }
            return;
        }
        if (requestCode == 8888) {
            int returnCode = IapClientHelper.parseRespCodeFromIntent(data);
            if (returnCode == OrderStatusCode.ORDER_STATE_SUCCESS) {
                // 请求成功,需要再次发起createPurchaseIntentWithPrice请求
            }
            return;
        }
    }

订单消耗

  public  void   payConsume(String inAppPurchaseData ){
        // 构造ConsumeOwnedPurchaseReq对象
        ConsumeOwnedPurchaseReq req = new ConsumeOwnedPurchaseReq();
        String purchaseToken = "";
        try {
            // purchaseToken需从购买信息InAppPurchaseData中获取
            InAppPurchaseData inAppPurchaseDataBean = new InAppPurchaseData(inAppPurchaseData);
            purchaseToken = inAppPurchaseDataBean.getPurchaseToken();
        } catch (JSONException e) {
        }
        req.setPurchaseToken(purchaseToken);
        // 获取调用接口的Activity对象
        final Activity activity =MainActivity.this;
       // 消耗型商品发货成功后,需调用consumeOwnedPurchase接口进行消耗
        Task<ConsumeOwnedPurchaseResult> task = Iap.getIapClient(activity).consumeOwnedPurchase(req);
        task.addOnSuccessListener(new OnSuccessListener<ConsumeOwnedPurchaseResult>() {
            @Override
            public void onSuccess(ConsumeOwnedPurchaseResult result) {
                // 获取接口请求结果
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                if (e instanceof IapApiException) {
                    IapApiException apiException = (IapApiException) e;
                    Status status = apiException.getStatus();
                    int returnCode = apiException.getStatusCode();
                } else {
                    // 其他外部错误
                }
            }
        });
    }

支付回调数据回传

/**
     *
     * @param payMap
     *  支付回调逻辑
     *
     */
    public  void   payCallback(Map<String,String>payMap){
        OkHttpUtils.post().url(Config.PAY_CALLBACK)
                .params(payMap)
                . build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {

                    }

                    @Override
                    public void onResponse(String response, int id) {
                        try {
                            JSONObject jsonObject=new JSONObject(response);
                            int status=jsonObject.optInt("status");

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }


                    }
                });
    }
上一篇下一篇

猜你喜欢

热点阅读