收银台支付接口
收银台方式同样是通过 JSAPI 方式发起的支付,只是简化了开发步骤和流程。适用于微信webview环境
收银台请求步骤:
- 构建请求参数
- 使用浏览器携带参数跳转至收银台地址
- 用户在收银台界面点击按钮发起支付
- 服务端接收异步通知
请求地址:https://payjs.cn/api/cashier
请求参数:
字段名称 | 字段类型 | 必填参数 | 说明 |
---|---|---|---|
mchid | string(16) | Y | 商户号 |
total_fee | int(16) | Y | 金额。单位:分 |
out_trade_no | string(32) | Y | 用户端自主生成的订单号,在用户端要保证唯一性 |
body | string(32) | N | 订单标题 |
attach | string(127) | N | 用户自定义数据,在notify的时候会原样返回 |
notify_url | string(255) | N | 接收微信支付异步通知的回调地址。必须为可直接访问的URL,不能带参数、session验证、csrf验证。留空则不通知 |
callback_url | string(32) | N | 用户支付成功后,前端跳转地址。留空则支付后关闭webview |
auto | bool | N | auto=1:无需点击支付按钮,自动发起支付。默认手动点击发起支付 |
hide | bool | N | hide=1:隐藏收银台背景界面。默认显示背景界面(这里hide为1时,自动忽略auto参数) |
logo | string(32) | N | 收银台显示的logo图片url |
sign | string(32) | Y | 数据签名 详见签名算法 |
请求返回:
收银台模式下,请求直接发起收银台支付。用户支付成功后,前台收银台页面自动关闭或跳转至自定义的 callback_url,后台系统会异步通知
特别提醒:支付后回调函数,并不能标示支付状态。用户需进一步完成验单逻辑
请求成功无返回。请求失败返回:
字段名称 | 字段类型 | 必填参数 | 说明 |
---|---|---|---|
return_code | int | Y | 0:提交失败 |
status | int | Y | 0:失败 |
msg | string(32) | Y | 失败原因 |
return_msg | string(32) | Y | 失败原因,同msg |
收银台演示代码:
<?php
/**
* 引入 payjs.class.php
* https://github.com/payjs-cn/phpsdk
*/
include("payjs.class.php");
$mchid = '123456';
$key = 'xxxxxx';
// 构造订单参数
$data = [
'mchid' => $mchid,
'body' => '我是一个测试订单标题',
'total_fee' => 1,
'out_trade_no' => 'payjs_jspay_demo_' . time(),
];
$payjs = new Payjs($mchid, $key);
$url = $payjs->cashier($data);
// 浏览器跳转到收银台
header('Location: ' . $url);
?>
php
<?php
/**
* 引入 payjs.class.php
* https://github.com/payjs-cn/phpsdk
*/
include("payjs.class.php");
$mchid = '123456';
$key = 'xxxxxx';
// 构造订单参数
$data = [
'mchid' => $mchid,
'body' => '我是一个测试订单标题',
'total_fee' => 1,
'out_trade_no' => 'payjs_jspay_demo_' . time(),
];
$payjs = new Payjs($mchid, $key);
$url = $payjs->cashier($data);
// 浏览器跳转到收银台
header('Location: ' . $url);
?>
python
# !/usr/bin/env Python3
# -*- coding: utf-8 -*-
import time
import hashlib
from urllib.parse import urlencode,unquote
import webbrowser as web
'''
收银台支付
'''
mchid = '' # PAYJS 商户号
key = '' # 通信密钥
# 构造订单参数
time = str(int(time.time()))
order = {
'mchid' : mchid,
'body' : '我是一个测试订单标题', # 订单标题
'total_fee' : 1, # 金额,单位:分
'out_trade_no' : 'payjs_jspay_demo_'+time, # 订单号
}
# 构造签名函数
def sign(attributes,key):
attributes_list = list(attributes)
for a in attributes_list:
if attributes[a]=='':
attributes.pop(a)
attributes_new = {k: attributes[k] for k in sorted(attributes.keys())}
return hashlib.md5((unquote(urlencode(attributes_new))+'&key='+key)
.encode(encoding='utf-8')).hexdigest().upper()
# 添加数据签名
order['sign'] = sign(order,key)
# 浏览器跳转到收银台
url = 'https://payjs.cn/api/cashier?'+str(urlencode(order))
web.open(url,new=0,autoraise=True)
go
package main
import (
"fmt"
"strings"
"net/http"
"net/url"
"io/ioutil"
)
func main(){
data := url.Values{"mchid":{"XXX"}, "total_fee":{"1"}, "out_trade_no":{"123123"}, "sign":{"XXX"}}
data2 := strings.NewReader(data.Encode())
resp, err := http.Post("https://payjs.cn/api/cashier", "application/x-www-form-urlencoded", data2)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
fmt.Println(string(body))
}