虚拟支付回调 openId 改为可选 #44
@@ -1087,12 +1087,12 @@ async def huihui_virtual_payment_notify(request: Request, db: Session = Depends(
|
|||||||
callback_env = int(payload.get("env"))
|
callback_env = int(payload.get("env"))
|
||||||
except (TypeError, ValueError, WechatVirtualPaymentError):
|
except (TypeError, ValueError, WechatVirtualPaymentError):
|
||||||
raise HTTPException(status_code=422, detail="invalid virtual payment details")
|
raise HTTPException(status_code=422, detail="invalid virtual payment details")
|
||||||
|
callback_open_id = str(payload.get("openId") or "").strip()
|
||||||
if (
|
if (
|
||||||
isinstance(payload.get("amountCents"), bool)
|
isinstance(payload.get("amountCents"), bool)
|
||||||
or isinstance(payload.get("env"), bool)
|
or isinstance(payload.get("env"), bool)
|
||||||
or not user
|
or not user
|
||||||
or not user.wechat_mp_openid
|
or (callback_open_id and callback_open_id != user.wechat_mp_openid)
|
||||||
or str(payload.get("openId") or "") != user.wechat_mp_openid
|
|
||||||
or not expected_product_id
|
or not expected_product_id
|
||||||
or str(payload.get("productId") or "") != expected_product_id
|
or str(payload.get("productId") or "") != expected_product_id
|
||||||
or amount_cents != order.price_cents
|
or amount_cents != order.price_cents
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ def test_huihui_virtual_callback_requires_signature_and_exact_order_details(auth
|
|||||||
"status": "SUCCESS",
|
"status": "SUCCESS",
|
||||||
"amountCents": 1000,
|
"amountCents": 1000,
|
||||||
"productId": "Basic",
|
"productId": "Basic",
|
||||||
"openId": "openid-huihui-callback",
|
|
||||||
"env": 1,
|
"env": 1,
|
||||||
}
|
}
|
||||||
path = "/api/token/payment/huihui/virtual/notify"
|
path = "/api/token/payment/huihui/virtual/notify"
|
||||||
@@ -64,6 +63,8 @@ def test_huihui_virtual_callback_requires_signature_and_exact_order_details(auth
|
|||||||
assert client.post(path, content=body, headers={"X-Huihui-Timestamp": str(int(time.time())), "X-Huihui-Signature": "bad"}).status_code == 401
|
assert client.post(path, content=body, headers={"X-Huihui-Timestamp": str(int(time.time())), "X-Huihui-Signature": "bad"}).status_code == 401
|
||||||
wrong = json.dumps({**payload, "amountCents": 999}, separators=(",", ":")).encode()
|
wrong = json.dumps({**payload, "amountCents": 999}, separators=(",", ":")).encode()
|
||||||
assert client.post(path, content=wrong, headers=_huihui_virtual_headers(secret, wrong)).status_code == 422
|
assert client.post(path, content=wrong, headers=_huihui_virtual_headers(secret, wrong)).status_code == 422
|
||||||
|
wrong_openid = json.dumps({**payload, "openId": "different-user"}, separators=(",", ":")).encode()
|
||||||
|
assert client.post(path, content=wrong_openid, headers=_huihui_virtual_headers(secret, wrong_openid)).status_code == 422
|
||||||
first = client.post(path, content=body, headers=_huihui_virtual_headers(secret, body))
|
first = client.post(path, content=body, headers=_huihui_virtual_headers(secret, body))
|
||||||
second = client.post(path, content=body, headers=_huihui_virtual_headers(secret, body))
|
second = client.post(path, content=body, headers=_huihui_virtual_headers(secret, body))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user