收银台支付接口


收银台方式同样是通过 JSAPI 方式发起的支付,只是简化了开发步骤和流程。适用于微信webview环境


收银台请求步骤:

  1. 构建请求参数
  2. 使用浏览器携带参数跳转至收银台地址
  3. 用户在收银台界面点击按钮发起支付
  4. 服务端接收异步通知

请求地址:https://payjs.cn/api/cashier

请求参数:

字段名称 字段类型 必填参数 说明
mchid string(16) Y 商户号
total_fee int(16) Y 金额。单位:分
out_trade_no string(32) Y 用户端自主生成的订单号,在用户端要保证唯一性
body string(64) N 订单标题
attach string(127) N 用户自定义数据,在notify的时候会原样返回
notify_url string(255) N 接收微信支付异步通知的回调地址。必须为可直接访问的URL,不能带参数、session验证、csrf验证。留空则不通知
callback_url string(255) N 用户支付成功后,前端跳转地址
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

收银台演示代码:

// 引入 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

// 引入 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))
}

node

// 首先引入文件,并在config.js中配置商户号和通信密钥
// 项目地址:https://github.com/payjs-cn/demo-nodejs

var cfg = require("./config.js"); 
var pay = require("./pay.js");

var params = {
  'mchid': cfg.payjsmchid,     //商户号
  'total_fee': 1,              //金额。单位:分
  'out_trade_no': '123456789', //用户端自主生成的订单号
  'body': '订单标题',           //订单标题
  'attach': '自定义数据',       //用户自定义数据,在notify的时候会原样返回
  'notify_url': ''             //接收微信支付异步通知的回调地址。必须为可直接访问的URL,不能带参数、session验证、csrf验证。留空则不通知
};

var url = pay.cashier(params);

console.log(url);
// 浏览器跳转到该url

java

// 完整代码:https://github.com/payjs-cn/demo-java
public void cashier(HttpServletResponse response) {
    Map<String,String> payData = new HashMap<>();
    payData.put("mchid", PayjsConfig.mchid);
    payData.put("total_fee", "100"); // 金额
    payData.put("out_trade_no", "83432749"); // 订单号 随便输的,自己生成一下就好了
    payData.put("body","订单标题");
    payData.put("notify_url", "https://你的域名/api/pay/nitify");

    // 进行sign签名
    payData.put("sign", sign(payData, PayjsConfig.key));

    // 收银台Url,通过浏览器跳转
    String url = PayjsConfig.cashierUrl + buildQuery(payData);

    // 给接口重定向到收银台url
    response.sendRedirect(url);
}

csharp

// 完整项目地址:https://github.com/payjs-cn/sdk-csharp

Payjs pay = new Payjs("YOUR MCHID", "YOUR KEY");

Dictionary<string, string> param = new Dictionary<string, string>();
param["total_fee"] = "1";
param["out_trade_no"] = DateTime.Now.Ticks.ToString();
param["body"] = "test";
param["attch"] = "user id";
param["notify_url"] = "YOUR notify_url";
param["callback_url"] = "自定义跳转url";

//返回收银台地址,直接跳转到此地址即可
string url = pay.cashier(param);

powered by Gitbook最后更新: 2022-05-26