统一收银台
简介
统一收银台是为了解决商户的业务系统收款问题, 商户可以通过统一收银台的接口,超级便捷的实现: 下单 --> 收款, 在任何入口迁入一行代码就可以完成收款,极大减少开发难度,大幅提升开发效率。
用法
- 只传下单参数,无需关心支付方式,支付方式由用户选择
curl -X GET 'https://c.justap.cn/v3?app_id=xxx&amount=1&subject=xxx'\
'&merchant_trade_id=xxx&sign=xxx'
- 支持多种支付方式,包括微信、支付宝、银联、微信小程序、支付宝小程序、微信H5、支付宝H5、微信公众号、银行卡等
参数列表
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | string | Y | 应用ID, 从 justap.cn后台获取 |
amount | string | Y | 订单金额,单位为元, 支持两位小数 |
subject | string | Y | 订单信息, 一般为商品名称, 需要URL Encode后传入, 要注意: 签名时不需要URL Encode |
merchant_trade_id | string | Y | 商户订单号, 由商户自己生成, 保证唯一性 |
sign | string | Y | 签名, 详见签名规则 |
timestamp | string | N | 时间戳, 详见签名规则 |
notify_url | string | N | 支付成功后的回调规则, 详见回调规则 |
auto_pay | string | N | 是否自动拉起支付,1:自动拉起, 0:显示支付按钮点击按钮拉起支付。默认值:0 |
pm | string | N | 指定跳转的支付渠道,在 H5 支付时推荐传递。如果该值为空,页面给出选项由顾客自行选择。wechatpay: 跳转至微信收银台; alipay: 跳转至支付宝首映台 |
签名算法
- 把所有参数按字典序排序
[A-Z]
,最后以key=value
方式拼接,多个参数之间适用&
连接, 得到待签名字符串 - 用商户
RSA
私钥对待签名字符串进行签名,签名算法为SHA256
,最后将签名bese64
- 把签名结果放入请求参数中,参数名为
sign
python 样例
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.serialization import load_pem_private_key
import time
import urllib.parse
from base64 import b64encode
# 生成私钥
# openssl genpkey -algorithm RSA -out mykey.pem -pkeyopt rsa_keygen_bits:2048
# 如果已经有私钥,可以跳过上面的步骤,直接使用私钥
priv_pem = """
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC945iG321HLRdc
...
PNkQzwAzrwHTgf9hB2q5PBZguSmjkWRNZSd4D/bZJSl+nk9LbOZBk2jkFAH2Xp2U
ZswymcGRsU62rXrAJlChCH5m
-----END PRIVATE KEY-----
""".encode()
def create_charge_url(app_id: str,
merchant_trade_id: str,
amount: float,
subject: str,
notify_url: str,
callback_url: str = None,
auto_pay=1,
timestamp=int(time.time()),
payment_url="https://c.justap.cn/v3"):
"""
生成支付链接
:param url: 支付网关地址
:param app_id: 商户 ID
:param merchant_trade_id: 商户订单号
:param amount: 订单金额
:param subject: 订单详情
:param notify_url: 支付成功后回调地址
:param auto_pay: 是否自动跳转
"""
# 生成待签名字符串, 所有参数按字典序排序[A-Z],最后以 key=value ⽅式拼接,多个参数之间适⽤ &
# 例如:amount=1.00&app_id=app_id&body=body&cb=cb&merchant_trade_id=merchant_trade_id¬ify_url=notify_url&subject=subject
# 生成待签名字符串
# Load and parse the private key
private_key = load_pem_private_key(priv_pem, password=None)
# URL and Parameters
params = {
"app_id": app_id,
"amount": amount,
"subject": subject,
"merchant_trade_id": merchant_trade_id,
"timestamp": timestamp,
"notify_url": notify_url,
"auto_pay": auto_pay,
"callback_url": callback_url,
}
# Create string to be signed
sign_str = '&'.join(f'{key}={value}' for key, value in sorted(params.items()))
print(f"before_sign_str: {sign_str}")
# 使用私钥签名
signature = private_key.sign(
sign_str.encode(),
padding.PKCS1v15(),
hashes.SHA256()
)
# 对生成的签名值进行 base64 编码
encoded_signature = b64encode(signature).decode()
params["sign"] = encoded_signature
print(f"encoded_signature: {encoded_signature}")
# 生成最终的支付链接
final_url = payment_url + "?" + urllib.parse.urlencode(params)
print(f"final_url: {final_url}")
return final_url
if __name__ == '__main__':
# 创建订单支付链接
charge_url = create_charge_url(
url="https://c.justap.cn/v3",
app_id="app_noxxxxxxx",
merchant_trade_id='Gv1Puuuiduuiduuiduuideff',
amount=0.02,
subject='测试商品',
notify_url='https://www.justap.cn',
timestamp=1703398398,
auto_pay=1
)
print(charge_url)