forked from thijooree/android
add dhiraagu bill pay
This commit is contained in:
+1
-1
@@ -17,5 +17,5 @@
|
||||
| [bmlapi/](bmlapi/README.md) | Bank of Maldives — hybrid web/OAuth login, dashboard, transfers, cards, QR payments, tap-to-pay |
|
||||
| [mibapi/](mibapi/README.md) | MIB Faisanet — Blowfish-encrypted API + WebView session, accounts, transfers, contacts |
|
||||
| [fahipayapi/](fahipayapi/README.md) | Fahipay digital wallet — login, balance, history, contacts |
|
||||
| [dhiraaguapi/](dhiraaguapi/README.md) | Dhiraagu Easy Pay / Easy TopUp — number lookup, reload by BML card |
|
||||
| [dhiraaguapi/](dhiraaguapi/README.md) | Dhiraagu Easy Pay / Easy TopUp — number lookup, reload and bill pay by BML card |
|
||||
| [ooredooapi/](ooredooapi/README.md) | Ooredoo Quick Pay — number validation for Raastas / bill pay |
|
||||
|
||||
@@ -235,7 +235,7 @@ merchant's own receipt page:
|
||||
```
|
||||
GET transaction…/<id>?wait=1
|
||||
→ 302 https://www.dhiraagu.com.mv/api/dhiraagu-bml-response.aspx?transactionId=<id>&state=CONFIRMED&signature=<sha1>
|
||||
→ 302 https://www.dhiraagu.com.mv/services/reload-receipt?pyid=<paymentId>
|
||||
→ 302 https://www.dhiraagu.com.mv/services/reload-receipt?pyid=<paymentId> (bill pay: /services/bill-receipt)
|
||||
```
|
||||
|
||||
(FahiPay's is `fahipay.mv/api/bml/gateway/callback/?…state=CONFIRMED`.)
|
||||
|
||||
@@ -172,4 +172,4 @@ UA, so these calls are made the same way.
|
||||
**Related:** [Number Lookup](01-number-lookup.md) · [BML Merchant Card Payment](../bmlapi/16-card-payment.md) ·
|
||||
App side: [Transfer Flows](../thijooree/20-transfer-flows.md#carrier-services-by-bml-card)
|
||||
|
||||
[← Number Lookup](01-number-lookup.md)
|
||||
[← Number Lookup](01-number-lookup.md) · [Bill Pay →](03-bill-pay.md)
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
# Bill Pay (Easy Pay, paid by BML card)
|
||||
|
||||
Pay a Dhiraagu postpaid bill through the dhiraagu.com.mv **Easy Pay** page. Like
|
||||
[Reload](02-reload.md), Dhiraagu only builds the order and the money moves on a **BML Merchant
|
||||
Services transaction** paid by card + 3-D Secure
|
||||
([BML API → Merchant Card Payment](../bmlapi/16-card-payment.md)). From the payment page on,
|
||||
the two flows are identical; only the first page, the cart call and the form id differ.
|
||||
|
||||
Reconstructed from `docs/dhiraaguapi/tmp/dhiraagu_billpay_gateway.har` (a Firefox HAR) and the
|
||||
Easy Pay page's inline script.
|
||||
|
||||
---
|
||||
|
||||
## Flow overview
|
||||
|
||||
```
|
||||
GET /services/easy-pay → nonce #1
|
||||
GET setting&act=bill (nonce #1) → blocked account statuses / customer types
|
||||
POST dhiraaguIO&act=infoUnlisted (nonce #1) → accountNumber, type, accountStatus, customerType
|
||||
POST cart&act=easyPay (nonce #1) → cartId
|
||||
GET /services/payment-v2?cartid=<cartId> → nonce #2
|
||||
POST merchant&act=form {"formId":1} → BML gateway's merchantId
|
||||
POST payment&act=create (formId 1) → paymentId, oid (EP…)
|
||||
POST bml&act=createV2 → BML transaction url
|
||||
── from here: the BML card-only merchant flow ──
|
||||
GET transaction.merchants…/<id>?wait=1 → 302 dhiraagu-bml-response.aspx (posts the payment)
|
||||
→ 302 /services/bill-receipt?pyid=<paymentId>
|
||||
```
|
||||
|
||||
As with reload, the `?wait=1` return hop is what tells Dhiraagu it was paid.
|
||||
|
||||
Common headers and the `{"respStatus":"OK","resp":…}` envelope are as in
|
||||
[Reload → Common](02-reload.md#common).
|
||||
|
||||
---
|
||||
|
||||
## 1. Settings
|
||||
|
||||
`GET …&sub=setting&act=bill` (no body, so a GET) — rules the page checks the lookup against:
|
||||
|
||||
```json
|
||||
{"settingAppJson1":{"accountStatus":{"val":["F"],…},"customerType":{"val":["P"],…}}}
|
||||
```
|
||||
|
||||
A number whose `accountStatus` or `customerType` is in a `val` list is refused before ordering
|
||||
("Payment for this service could not be accepted… [Account Status: F]" / "The number is not
|
||||
allowed. [Customer Type: P]"). Thijooree applies the same rules, skipping them if the call fails.
|
||||
|
||||
`setting&act=maintenance` has `public.easyPay` — `"Y"` means the page is under maintenance.
|
||||
Not checked.
|
||||
|
||||
---
|
||||
|
||||
## 2. Lookup
|
||||
|
||||
`sub=dhiraaguIO&act=infoUnlisted`, `{"number":"7XXXXXX"}` — the same call as
|
||||
[Number Lookup](01-number-lookup.md), but the bill payment needs more of its answer:
|
||||
|
||||
```json
|
||||
{"respStatus":"OK","accountNumber":"1466154","accountStatus":"W","customerType":"S",
|
||||
"type":"BillPayment","serviceDetails":[{"unlisted":"N","prepaidIndicator":"N"}],
|
||||
"accountOwnerInfo":{"name":"…"}}
|
||||
```
|
||||
|
||||
Note the fields are at the top level, not under `resp`.
|
||||
|
||||
| Field | Use |
|
||||
|---|---|
|
||||
| `accountNumber` | the billing account the cart is made out to |
|
||||
| `type` | `BillPayment`, or `writeOffPayments` for a written-off account — sent as `billType` |
|
||||
| `prepaidIndicator` | `"Y"` is refused ("Prepaid number is not allowed.") |
|
||||
|
||||
The page also accepts the account number itself in place of a service number (then
|
||||
`serviceNumber` is sent empty); Thijooree only pays by phone number.
|
||||
|
||||
---
|
||||
|
||||
## 3. Cart
|
||||
|
||||
`sub=cart&act=easyPay`, nonce from `GET /services/easy-pay`.
|
||||
|
||||
```json
|
||||
{"formId":1,"serviceNumber":"7XXXXXX","accountNumber":"1466154","amount":"1.05",
|
||||
"memberId":"","memberName":"","memberNId":"","billRef":"","billType":"BillPayment"}
|
||||
```
|
||||
```json
|
||||
{"cartId":"8fc33fa4-…","formId":1,"cartJson":[{"accountNumber":"1466154","serviceNumber":"7XXXXXX",
|
||||
"amount":1.05,"billRef":"","billType":"BillPayment"}],"cartAmount":1.05,"cartExpiry":"…(20 min)…",
|
||||
"paymentUrl":"https://www.dhiraagu.com.mv/services/payment-v2?cartid=8fc33fa4-…", …}
|
||||
```
|
||||
|
||||
| Rule | Value |
|
||||
|---|---|
|
||||
| Amount | any positive amount, up to 2 decimal places (the page's only check). No min / max. |
|
||||
| GST | none |
|
||||
|
||||
---
|
||||
|
||||
## 4. Payment page
|
||||
|
||||
Same as [Reload §3–5](02-reload.md#3-payment-gateway) with `formId: 1`:
|
||||
|
||||
- `merchant&act=form` lists DhiraaguPay (3), Bank of Maldives (1) and MIB (2) for "Easy Pay".
|
||||
The BML `merchantId` is the same as reload's.
|
||||
- `payment&act=create` returns an `oid` starting `EP` (reload's start `ET`).
|
||||
- `bml&act=createV2` returns the transaction with `"customerReference":"WebApp - Easy Pay"` and
|
||||
the same `redirectUrl`. Its page is card-only, no BML Pay.
|
||||
|
||||
---
|
||||
|
||||
## Bill record
|
||||
|
||||
`sub=bill&act=list`, `{"paymentId"}`, nonce from the receipt page — what the receipt shows:
|
||||
|
||||
```json
|
||||
[{"oid":"EP20260006911918","transId":"<BML txn id>","accountNumber":"1466154","serviceNumber":"7XXXXXX",
|
||||
"amount":1.05,"billStatus":1,"paidStatus":1,"cbsStatus":1,"cbsReceipt":"EP…-130","billType":"BillPayment", …}]
|
||||
```
|
||||
|
||||
Not used by Thijooree yet.
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
**Related:** [Number Lookup](01-number-lookup.md) · [Reload](02-reload.md) ·
|
||||
[BML Merchant Card Payment](../bmlapi/16-card-payment.md) ·
|
||||
App side: [Transfer Flows](../thijooree/20-transfer-flows.md#carrier-services-by-bml-card)
|
||||
|
||||
[← Reload](02-reload.md)
|
||||
@@ -97,6 +97,7 @@ The API only returns a valid result for numbers currently on the Dhiraagu networ
|
||||
|---|---|---|
|
||||
| 1 | [Number Lookup](01-number-lookup.md) | Validate a Dhiraagu number and determine account type |
|
||||
| 2 | [Reload](02-reload.md) | Easy TopUp order → BML merchant transaction, paid by card |
|
||||
| 3 | [Bill Pay](03-bill-pay.md) | Easy Pay order → BML merchant transaction, paid by card |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ A phone number searched with no source yet (or from a BML card that can pay by c
|
||||
|---|---|---|
|
||||
| Favara Transfer | bank account behind the number | MIB or BML account |
|
||||
| Fahipay service | Raastas, Ooredoo Bill Pay, Dhiraagu Reload, Dhiraagu Bill Pay | Fahipay wallet |
|
||||
| Card service | Dhiraagu Reload (BML badge) | Verified BML card |
|
||||
| Card service | Dhiraagu Reload, Dhiraagu Bill Pay (BML badge) | Verified BML card |
|
||||
|
||||
One option is applied straight away; with more, a picker opens and Send stays disabled until one is chosen. Picking a type also picks a source that can pay it. Fahipay and card services clear and disable the Remarks field and apply their own amount rules (minimum, maximum, whole amounts, 8% GST note). Details: [Transfer Flows → Transfer Type picker](20-transfer-flows.md#transfer-type-picker).
|
||||
|
||||
@@ -122,11 +122,11 @@ When the source is a BML USD account and the destination is a MIB account but no
|
||||
|
||||
See [Transfer Flows → Fahipay source](20-transfer-flows.md#fahipay-source).
|
||||
|
||||
### Carrier Service by BML Card (Dhiraagu Reload)
|
||||
### Carrier Service by BML Card (Dhiraagu Reload / Bill Pay)
|
||||
|
||||
1. Checks the amount against Dhiraagu's rules (MVR 20–1000, whole amounts, 8% GST included)
|
||||
2. A "Processing..." dialog shows while Dhiraagu creates the order and its BML merchant transaction ([Dhiraagu API → Reload](../dhiraaguapi/02-reload.md))
|
||||
3. From there it is the card-only merchant flow: the same confirm dialog and warning, biometric gate, card + 3-D Secure payment, and the return to Dhiraagu (`?wait=1`) that tops the number up
|
||||
1. Checks the amount against Dhiraagu's rules (reload: MVR 20–1000, whole amounts, 8% GST included; bill pay: from MVR 1, up to 2 decimals, no GST)
|
||||
2. A "Processing..." dialog shows while Dhiraagu creates the order and its BML merchant transaction ([Dhiraagu API → Reload](../dhiraaguapi/02-reload.md), [→ Bill Pay](../dhiraaguapi/03-bill-pay.md))
|
||||
3. From there it is the card-only merchant flow: the same confirm dialog and warning, biometric gate, card + 3-D Secure payment, and the return to Dhiraagu (`?wait=1`) that tops the number up or posts the bill payment
|
||||
4. On success, the result shows inside the dialog; if Dhiraagu couldn't be notified, a toast gives the BML transaction id
|
||||
|
||||
See [Transfer Flows → Carrier services by BML card](20-transfer-flows.md#carrier-services-by-bml-card).
|
||||
|
||||
@@ -151,8 +151,8 @@ None of the Fahipay services take a reference. Picking one clears the Reference
|
||||
### Carrier services by BML card
|
||||
|
||||
A carrier service can also be paid with a verified BML card, through the carrier's own website
|
||||
and its BML merchant gateway, instead of the Fahipay wallet. Only **Dhiraagu Reload** so far
|
||||
(`CardPayoutService`, `ui/home/transfer/CardPayoutTransferHandler.kt`).
|
||||
and its BML merchant gateway, instead of the Fahipay wallet. Only **Dhiraagu Reload** and
|
||||
**Dhiraagu Bill Pay** so far (`CardPayoutService`, `ui/home/transfer/CardPayoutTransferHandler.kt`).
|
||||
|
||||
**Which cards.** A card qualifies when it's verified and its BML login has an OTP seed, the same
|
||||
rule as card-only merchant links (`BmlVerifiedCards`, see
|
||||
@@ -165,6 +165,7 @@ drops the pick, like any other source that can't pay the picked type.
|
||||
| Carrier result | Service |
|
||||
|---|---|
|
||||
| Dhiraagu `RELOAD` | Dhiraagu Reload |
|
||||
| Dhiraagu `BILL_PAY` | Dhiraagu Bill Pay |
|
||||
|
||||
**Amount rules.** The carrier website's, not Fahipay's. They're checked the same way, through
|
||||
the shared `PayoutAmountField`:
|
||||
@@ -172,6 +173,9 @@ the shared `PayoutAmountField`:
|
||||
| Service | Min (MVR) | Max (MVR) | Decimals | GST |
|
||||
|---|---|---|---|---|
|
||||
| Dhiraagu Reload | 20 | 1,000 | no | 8%, included (credit = amount − round2(amount × 0.08 / 1.08)) |
|
||||
| Dhiraagu Bill Pay | 1 | none | up to 2 places | none |
|
||||
|
||||
Easy Pay itself sets no minimum or maximum; the MVR 1 floor is Thijooree's.
|
||||
|
||||
**Reference.** None. The field is cleared and disabled, as for the Fahipay services.
|
||||
|
||||
@@ -179,7 +183,9 @@ the shared `PayoutAmountField`:
|
||||
BML transaction comes from:
|
||||
|
||||
1. `CardPayoutTransferHandler.submit()` has the carrier create it for the number and amount
|
||||
(`DhiraaguReloadClient.createBmlTransaction`, see [Dhiraagu API → Reload](../dhiraaguapi/02-reload.md)).
|
||||
(`DhiraaguPaymentClient.createReloadTransaction` / `createBillPayTransaction`, see
|
||||
[Dhiraagu API → Reload](../dhiraaguapi/02-reload.md) and [→ Bill Pay](../dhiraaguapi/03-bill-pay.md)).
|
||||
Bill pay looks the number up again first, for the billing account the order is made out to.
|
||||
That takes a few round trips, so the payment's "Processing..." box shows meanwhile
|
||||
(`TransferFragment.showProcessingDialog`) and closes before the confirm dialog opens.
|
||||
2. Its payment page is loaded (`BmlMerchantTxnClient.fetchPayPage`). If it doesn't take cards, or
|
||||
@@ -259,7 +265,7 @@ Source: Fahipay
|
||||
Transfer type: Card (verified BML card)
|
||||
|
||||
└── Carrier creates a BML merchant transaction → card-only merchant flow
|
||||
DHIRAAGU_RELOAD
|
||||
DHIRAAGU_RELOAD, DHIRAAGU_BILL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -9,7 +9,7 @@ Two linked features:
|
||||
whose merchant has **no BML Pay** is paid with a verified card via the Pomelo + 3-D Secure flow
|
||||
([BML API → Merchant Card Payment](../bmlapi/16-card-payment.md)). The same flow pays
|
||||
[carrier services by BML card](20-transfer-flows.md#carrier-services-by-bml-card) (Dhiraagu
|
||||
Reload), once the carrier has created the transaction.
|
||||
Reload and Bill Pay), once the carrier has created the transaction.
|
||||
|
||||
> ⚠️ The merchant card flow is scraped browser/ACS traffic, not a stable API. Storing the CVV is a
|
||||
> security/PCI liability. See the API doc's
|
||||
|
||||
Reference in New Issue
Block a user