Skip to main content

统一收银台

简介

        统一收银台是为了解决商户的业务系统收款问题, 商户可以通过统一收银台的接口,超级便捷的实现: 下单 --> 收款, 在任何入口迁入一行代码就可以完成收款,极大减少开发难度,大幅提升开发效率。

用法

  • 只传下单参数,无需关心支付方式,支付方式由用户选择
curl -X GET 'https://c.justap.cn/v3?app_id=xxx&amount=1&subject=xxx'\
'&merchant_trade_id=xxx&sign=xxx'
  • 支持多种支付方式,包括微信、支付宝、银联、微信小程序、支付宝小程序、微信H5、支付宝H5、微信公众号、银行卡等

参数列表

参数类型必填描述
app_idstringY应用ID, 从 justap.cn后台获取
amountstringY订单金额,单位为元, 支持两位小数
subjectstringY订单信息, 一般为商品名称, 需要URL Encode后传入, 要注意: 签名时不需要URL Encode
merchant_trade_idstringY商户订单号, 由商户自己生成, 保证唯一性
signstringY签名, 详见签名规则
timestampstringN时间戳, 详见签名规则
notify_urlstringN支付成功后的回调规则, 详见回调规则
auto_paystringN是否自动拉起支付,1:自动拉起, 0:显示支付按钮点击按钮拉起支付。默认值:0
pmstringN指定跳转的支付渠道,在 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&notify_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)