华为支付国内版接入流程
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();
}
}
});
}