发布于2021-06-07 21:57 阅读(1144) 评论(0) 点赞(16) 收藏(4)
掉单,就是钱付了,货没发。
当用户拉起应用内支付,购买应用中提供的虚拟商品或服务时,由于网络错误、进程被中止等原因,导致应用与支付服务器之间数据同步出现差错,使得用户付款后没有收到货。作为一个极端场景,掉单是所有开发者和运营人员都不想遇到的问题。一个掉单足以让用户体验一键清零,偶尔伴随1星差评,更严重者,产生负面舆情,给你的应用来个措手不及。
面对时有发生的掉单“事故”,常见的解决方法是,用户发起起诉,开启退款流程,这里增加的操作成本,一样打击着用户体验,都要用好不容易积累的用户好感度来兑换。
教你一招,使用华为应用内支付彻底“根治”掉单。
在应用中调用应用内支付功能接口,向服务器端口查询已成交订单,服务器将已付款未消耗的订单信息筛选出来,返回给应用程序,应用程序根据查询结果进行补发货操作,完成后更新服务器上的订单状态。
详细的开发及操作细节,且往下看
在应用内支付购买流程中,消耗类商品购买完成后,需调用消耗接口,没有成功调用消耗接口,故而产生掉单事故。非消耗及订阅类产品不需调用消耗接口,所以这两类应用内商品不存在掉单问题。
消耗型商品典型购买流程如下:
1、用户发起购买后,应用需向HMS Core(APK)发起购买请求。
2、请求发货。需对购买详情数据进行验签处理。
3、发放商品。需把已发货商品的购买Token传至你的服务器,后续如消耗失败也可从你的服务器获取商品的发货状态,从而避免重复发货的情况。
4、务必确保发货成功后进行本步骤调用。发货成功后应用需要使用consumeOwnedPurchase接口消耗该商品,以此通知华为应用内支付服务器更新商品的发货状态。发送consumeOwnedPurchase请求时,请在请求参数中携带购买数据中的purchaseToken。应用成功执行消耗之后,华为应用内支付服务器会将相应商品重新设置为可购买状态,用户即可再次购买该商品。
你也可使用服务端Order服务确认购买接口消耗商品,用于替换IAP客户端consumeOwnedPurchase接口。
针对由于网络错误、进程被中止等原因,应用程序和支付服务器之间数据同步出现差错而致的掉单场景,华为应用内支付提供了消耗型商品的补单机制。你的应用可以参考以下流程图进行处理。
在以下场景触发补单机制:
1、使用obtainOwnedPurchases获取用户已购未发货的消耗型商品的购买信息。您的应用需要在请求参数OwnedPurchasesReq中指定查询的priceType为0。
当接口请求成功时,IAP将返回一个OwnedPurchasesResult对象,该对象包含用户所有已购但未发货的商品购买信息及其签名数据,您需要使用在华为AppGallery Connect分配的公钥进行签名验证,验证方法请参见对返回结果验签。
每个购买信息均以JSON格式的String形式呈现,包含的参数请参见InAppPurchaseData。您需要从InAppPurchaseData的字符串中解析出purchaseState字段,当purchaseState为0时表示此次交易是成功的,您的应用仅需要对这部分商品进行补发货操作。
- // 构造一个OwnedPurchasesReq对象
- OwnedPurchasesReq ownedPurchasesReq = new OwnedPurchasesReq();
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- ownedPurchasesReq.setPriceType(0);
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- // 调用obtainOwnedPurchases接口获取所有已购但未发货的消耗型商品的购买信息
- Task<OwnedPurchasesResult> task = Iap.getIapClient(activity).obtainOwnedPurchases(ownedPurchasesReq);
- task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
- @Override
- public void onSuccess(OwnedPurchasesResult result) {
- // 获取接口请求成功的结果
- if (result != null && result.getInAppPurchaseDataList() != null) {
- for (int i = 0; i < result.getInAppPurchaseDataList().size(); i++) {
- String inAppPurchaseData = result.getInAppPurchaseDataList().get(i);
- String inAppSignature = result.getInAppSignature().get(i);
- // 使用应用的IAP公钥验证inAppPurchaseData的签名数据
- // 如果验签成功,确认每个商品的购买状态。确认商品已支付后,检查此前是否已发过货,未发货则进行发货操作。发货成功后执行消耗操作
- try {
- InAppPurchaseData inAppPurchaseDataBean = new InAppPurchaseData(inAppPurchaseData);
- int purchaseState = inAppPurchaseDataBean.getPurchaseState();
- } catch (JSONException e) {
- }
- }
- }
- }
- }).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 {
- // 其他外部错误
- }
- }
- });
2、使用consumeOwnedPurchase接口对已发货商品进行消耗。
您需要对obtainOwnedPurchases返回的每个商品数据进行发货确认,确认已发货后使用consumeOwnedPurchase接口消耗所有已发货商品,以此通知华为应用内支付服务器更新商品的发货状态。对于消耗型商品,应用成功执行消耗之后,华为服务器会将相应商品重新设置为可购买状态,用户即可再次购买该商品。
了解应用内支付接入启用、商品创建、沙盒测试,点击回顾:从零开始详解应用内支付——商品创建及测试上架
了解应用内支付商品修改和数据获取,点击回顾:应用内支付商品修改和数据获取,一文带你全部搞懂
>>访问华为应用内支付官网,了解更多相关内容
>>获取华为应用内支付开发指导文档
>>华为HMS Core官方论坛
>>华为移动服务开源仓库地址:GitHub、Gitee
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~
原文链接:https://blog.csdn.net/HUAWEI_HMSCore/article/details/117571752
作者:龙膜授权
链接:http://www.phpheidong.com/blog/article/89835/7912d8169902e95d8927/
来源:php黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 php黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-4
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!