amazonpay
This commit is contained in:
+117
@@ -0,0 +1,117 @@
|
|||||||
|
# IPay 近期需求排期
|
||||||
|
|
||||||
|
## P0 - 超级优先级
|
||||||
|
|
||||||
|
### 1. 收银台功能
|
||||||
|
- 实现新版收银台。
|
||||||
|
- 参考 AA 收银台方案。
|
||||||
|
- 参考 APK:
|
||||||
|
- dd1.com
|
||||||
|
|
||||||
|
### 2. DeepLink + 透传能力
|
||||||
|
- 实现 DeepLink 唤起能力。
|
||||||
|
- 支持参数透传。
|
||||||
|
- 与 Queue(Que)系统联调对接。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## P1 - 紧急需求
|
||||||
|
|
||||||
|
### 1. H5 版本 IPay
|
||||||
|
- 开发并上线 H5 版本 IPay。
|
||||||
|
|
||||||
|
### 2. 运营重绑权限
|
||||||
|
- 为运营角色增加「发送重绑」权限。
|
||||||
|
- 支持后台直接触发重绑流程。
|
||||||
|
|
||||||
|
### 3. PhonePe Business 卡配对状态修复
|
||||||
|
- 支持将 PhonePe Business 卡恢复为「未绑定 / 无卡」状态。
|
||||||
|
- 方便重新配对和异常处理。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## P2 - 高优先级
|
||||||
|
|
||||||
|
### 1. 流水保存机制优化
|
||||||
|
数据库保存流水规则:
|
||||||
|
|
||||||
|
- 前 30 分钟:
|
||||||
|
- 每 10 分钟保存一次。
|
||||||
|
|
||||||
|
- 30 分钟后:
|
||||||
|
- 每 30 分钟保存一次。
|
||||||
|
|
||||||
|
目的:
|
||||||
|
- 降低存储压力。
|
||||||
|
- 保留关键操作轨迹。
|
||||||
|
- 满足问题追溯需求。
|
||||||
|
|
||||||
|
### 2. 用户钱包开放
|
||||||
|
- 支持针对指定用户开放钱包功能。
|
||||||
|
- 后续支持精细化配置。
|
||||||
|
|
||||||
|
### 3. 用户代理模式配置
|
||||||
|
支持针对指定用户设置代理模式。
|
||||||
|
|
||||||
|
配置项:
|
||||||
|
|
||||||
|
- 当前代理模式
|
||||||
|
- 生效时间
|
||||||
|
- 冷却时间(持续时长)
|
||||||
|
|
||||||
|
规则:
|
||||||
|
|
||||||
|
- `-1` 表示永久生效
|
||||||
|
- 支持用户级配置覆盖
|
||||||
|
- 支持系统默认配置
|
||||||
|
- 未配置用户使用全局默认配置
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## P3 - 产品与运营优化
|
||||||
|
|
||||||
|
### 1. 官方频道建设
|
||||||
|
- 建立官方频道运营体系。
|
||||||
|
- 提升用户触达能力。
|
||||||
|
- 用于公告、活动、维护通知等场景。
|
||||||
|
|
||||||
|
### 2. 错误提示文案优化
|
||||||
|
目标:
|
||||||
|
|
||||||
|
- 减少用户困惑
|
||||||
|
- 减少运营沟通成本
|
||||||
|
- 提高问题定位效率
|
||||||
|
|
||||||
|
要求:
|
||||||
|
|
||||||
|
- 提示信息明确具体
|
||||||
|
- 不使用模糊文案
|
||||||
|
- 告知用户原因及处理方式
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
❌ 当前操作失败
|
||||||
|
|
||||||
|
✅ 当前钱包已离线,请等待设备重新上线后重试
|
||||||
|
|
||||||
|
❌ 提交失败
|
||||||
|
|
||||||
|
✅ 当前订单状态已变更,请刷新页面后重新提交
|
||||||
|
|
||||||
|
❌ 系统异常
|
||||||
|
|
||||||
|
✅ 当前代理连接失败,请检查代理配置或联系运营处理
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 备注
|
||||||
|
|
||||||
|
当前阶段重点:
|
||||||
|
|
||||||
|
1. 收银台
|
||||||
|
2. DeepLink + 透传
|
||||||
|
3. H5 版本 IPay
|
||||||
|
4. 重绑权限
|
||||||
|
5. PhonePe Business 配对状态恢复
|
||||||
|
|
||||||
|
以上需求优先保障上线进度,其余需求按排期逐步推进。
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
调度:
|
||||||
|
1.目前需要对卡级别做平行数限制,默认有最大值,但是也可以对单独的卡做平行限制,有些好卡,应该多收,特别是 biz 卡,biz 卡的笔数并没有限制,原则上来说,一个健康的卡,应该是没有上限的,一个 biz 卡的额度每天是 20w
|
||||||
|
对于个卡的话,我们抓到今天一天的记录,我们可以统计出这个卡目前已经接了多少笔,用 个卡总额减去已经接的笔数,然后取这个余额值和平行的 max,比如这个卡最终每天只能接 3 笔,平行数是 6,那么平行数就是 3
|
||||||
|
我们目前的情况下,都是固定的 6 笔,假设其实最多可以收一笔了,那么平行数如果派 6,那么其他 5 笔是一定失败的
|
||||||
|
|
||||||
|
2.得加上统计每个人回款的平均时间,我们目前是采用大单优先的原则,有时候,可能第一的额度特别大,假设是 5w,第二个1w,容易造成这个后面排队的就一直排不到
|
||||||
|
加上等待时间加权,等待越久,权重就会越高,随着时间的推移,权重最终会超过第一,从而拿到单,拿到单
|
||||||
|
|
||||||
|
回款周期这里,很简单的比方,假设身上就 3000 块,1 小时回款的话,10 个小时,可以做 10 笔,就可以做到 3w 的任务,但是如果 10 小时回款,那么 就只可以做 3000 的任务
|
||||||
|
用户没有建立信任的话,他只会拿这一部分钱去做任务,回款慢的话,他会担心投进去的钱会回不来,
|
||||||
|
但是如果 1 小时就回来了,他肯定会继续做单,因为他想着我反正回来快,我拿原来的 3000 继续做就可以了,他就愿意去分享
|
||||||
|
|
||||||
|
3.计算当前可以收的额度,向 bestpay 去获取订单,可以收多少,bestpay 再放多少,自动处理(核心)
|
||||||
|
|
||||||
|
4.对卡3 笔就风控封禁的情况,我们加自动化处理
|
||||||
|
1.vpa 错误,直接给加速冻结
|
||||||
|
2.9 比冻结的,自动支付一笔,成功则自动解封,冻结清零
|
||||||
|
3.对于自助解封这里,总体问题不大,可以适当加大这个次数,间隔可以缩短为 30 秒
|
||||||
|
|
||||||
|
5.小额的用 biz 优先去接,用户设置的这个额度区间,是优先派,不是仅限
|
||||||
|
|
||||||
|
技术方面:
|
||||||
|
1.自动补单的时候,如果是掉绑了,自动发rebind 通知,拉活,对于任意需要查单的地方,只要掉绑了,只要触发了,就要自动发,增加拉活几率
|
||||||
|
2.增加拉流水限频,防止被风控(已经在测试)
|
||||||
|
3.代理模式查看和修改
|
||||||
|
|
||||||
|
|
||||||
|
客户端:
|
||||||
|
1.加入打点,分析一下用户的行为,看下到底是哪里跳走了(分析后才可以知道目前转化差的原因)
|
||||||
|
2.界面参考 AAPay,最大的问题是我们的任务不太可见,需要滑动才能看到,参考 AAPay,横向滚动就可以,把收益给标出来,奖励的地方,把奖励的数额都要加特殊颜色
|
||||||
|
3.消息悬浮球,增加触达率,有消息立马可以知道
|
||||||
|
|
||||||
|
产品方面:
|
||||||
|
1.现在用户慢慢起来了,我们发功能一定要做灰度,比如最开始最 userId 尾号是 0 的灰度,出功能,一定可以有开关,后台随时开关,不行就撤掉,行就加大灰度,前面几次的问题导致用户反馈很多,影响大,有灰度的话
|
||||||
|
波及面不大,可以快速回滚,遇到有问题我们后台先关,技术可以游刃有余的去找问题
|
||||||
|
|
||||||
|
2.IP 代理池,找备案,定期测试备着的 IP 是否 OK
|
||||||
|
|
||||||
|
|
||||||
+1
-1
@@ -29,7 +29,7 @@
|
|||||||
"react-native-svg": "^14.1.0",
|
"react-native-svg": "^14.1.0",
|
||||||
"react-native-svg-transformer": "^1.5.3",
|
"react-native-svg-transformer": "^1.5.3",
|
||||||
"react-native-webview": "13.6.2",
|
"react-native-webview": "13.6.2",
|
||||||
"rnwalletman": "./libs/rnwalletman"
|
"rnwalletman": "./libs/rnwalletman/"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.20.0",
|
"@babel/core": "^7.20.0",
|
||||||
|
|||||||
+5
-18
@@ -37,6 +37,7 @@ import {
|
|||||||
PaytmPersonalBindResult,
|
PaytmPersonalBindResult,
|
||||||
MobikwikPersonalBind,
|
MobikwikPersonalBind,
|
||||||
MobikwikPersonalBindResult,
|
MobikwikPersonalBindResult,
|
||||||
|
AmazonPayPersonalBind,
|
||||||
BindErrorCode,
|
BindErrorCode,
|
||||||
ProxyBackgroundService,
|
ProxyBackgroundService,
|
||||||
} from 'rnwalletman';
|
} from 'rnwalletman';
|
||||||
@@ -49,7 +50,6 @@ import {
|
|||||||
BharatPeBusinessOTPBind,
|
BharatPeBusinessOTPBind,
|
||||||
PaytmBusinessOTPBind,
|
PaytmBusinessOTPBind,
|
||||||
PhonePeBusinessOTPBind,
|
PhonePeBusinessOTPBind,
|
||||||
AmazonPayOTPBind,
|
|
||||||
} from '../components/WalletBindComponents';
|
} from '../components/WalletBindComponents';
|
||||||
import { WalletSelectModal, WALLET_ICONS, WALLET_TYPE_COLORS } from '../components/WalletSelectModal';
|
import { WalletSelectModal, WALLET_ICONS, WALLET_TYPE_COLORS } from '../components/WalletSelectModal';
|
||||||
import { ServerSettingsModal } from '../components/ServerSettingsModal';
|
import { ServerSettingsModal } from '../components/ServerSettingsModal';
|
||||||
@@ -904,24 +904,11 @@ export default class HomeScreen extends Component<any, HomeScreenState> {
|
|||||||
transparent
|
transparent
|
||||||
onRequestClose={close('showAmazonPayPersonalBind')}
|
onRequestClose={close('showAmazonPayPersonalBind')}
|
||||||
>
|
>
|
||||||
<AmazonPayOTPBind
|
<AmazonPayPersonalBind
|
||||||
|
processString="Processing..."
|
||||||
isDebug
|
isDebug
|
||||||
initialMobile={bindPrefillMobile}
|
onSuccess={this.handleBindSuccess('showAmazonPayPersonalBind', WalletType.AMAZONPAY_PERSONAL, 'Amazon Pay bound successfully') as any}
|
||||||
onRequestOTP={async (wt, p) => {
|
onError={(e: string) => { Alert.alert('Bind Failed', e); close('showAmazonPayPersonalBind')(); }}
|
||||||
this._otpCardId = this._pendingCardId ?? newCardId(Api.instance.getUserId(), wt, p.mobile);
|
|
||||||
return this.wrapOtpCall(() => Api.instance.requestOTP(wt, p.mobile, {
|
|
||||||
...(p.sessionId ? { sessionId: p.sessionId } : {}),
|
|
||||||
...(p.password ? { password: p.password } : {}),
|
|
||||||
}, this._otpCardId));
|
|
||||||
}}
|
|
||||||
onVerifyOTP={async (wt, p) => {
|
|
||||||
return this.wrapOtpCall(() => Api.instance.verifyOTP(wt, p.mobile, p.otp, {
|
|
||||||
sessionId: p.sessionId,
|
|
||||||
...(p.password ? { password: p.password } : {}),
|
|
||||||
}, this._otpCardId));
|
|
||||||
}}
|
|
||||||
onSuccess={this.onOtpBindSuccess('showAmazonPayPersonalBind', 'Amazon Pay bound successfully')}
|
|
||||||
onError={() => {}}
|
|
||||||
/>
|
/>
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -267,7 +267,7 @@
|
|||||||
},
|
},
|
||||||
bharatpe_biz: { // can't work
|
bharatpe_biz: { // can't work
|
||||||
label: 'BharatPe Business',
|
label: 'BharatPe Business',
|
||||||
pa: 'BHARATPE.8000605521@fbpe', pn: 'BharatPe Merchant',
|
pa: 'BHARATPE.8C0L1Q1Z4P67812@fbpe', pn: 'BharatPe Merchant',
|
||||||
extra: () => '&tn=Pay+To+BharatPe+Merchant',
|
extra: () => '&tn=Pay+To+BharatPe+Merchant',
|
||||||
warn: null,
|
warn: null,
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user