美文网首页
华为支付国内版接入流程

华为支付国内版接入流程

作者: xq9527 | 来源:发表于2022-05-03 20:44 被阅读0次

    前言:

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

    需要用到的三方库

        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();
                            }
    
    
                        }
                    });
        }
    

    相关文章

      网友评论

          本文标题:华为支付国内版接入流程

          本文链接:https://www.haomeiwen.com/subject/mnsiyrtx.html