SpringBoot +扫呗支付

558 阅读1分钟

概述:最近在研发一款收银软件,需要用到扫呗支付,为此把我踩的坑分享给大家

准备资料

研究官网API

  • 请求扫呗路径
  • 注意路径的端口为8045,官网给的8010端口是错的(一致以为自己的思路是错的),问了扫呗技术人员端口为8045。 test.lcsw.cn:8045/lcsw
  • 生成签名(注意参数的拼接顺序)

  • 本次开发的是付款码支付

java生成签名算法如下

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jjmy.entity.PosPrepayRe;
import com.jjmy.utils.MD5;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@RestController
@RequestMapping("/pay")
public class PayController {
    //版本号
    public static String pay_ver = "100";
    //请求类型
    public static String pay_type = "000";
    //接口类型
    public static String service_id = "010";
    //商户号
    public static String merchant_no = "扫呗官方给予";
    //终端号
    public static String terminal_id = "扫呗官方给予";
    //终端流水号
    public static String terminal_trace = getMasterId();
    //终端交易时间
    public static String terminal_time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
    public static String access_token = "扫呗官方给予";
    //请求服务器接口
    public static String prePay_url = "http://test.lcsw.cn:8045/lcsw/pay/100/barcodepay";


    @RequestMapping(value = "/barCodePay", method = RequestMethod.POST)
    //auth_no,total_free是前端传递的参数,可以结合自己的业务需求更改
    public static PosPrepayRe barCodePay(@Param("auth_no") String auth_no,
                                         @Param("total_fee") String total_fee) {

        System.out.println(terminal_trace + "退款订单号");
        System.out.println(terminal_time + "退款时间戳");
        //扫呗方法给的返回对象,SDK中有
        PosPrepayRe posPrePayRe = new PosPrepayRe();
        try {
            JSONObject jsonParam = new JSONObject();
            jsonParam.put("pay_ver", pay_ver);
            jsonParam.put("pay_type", pay_type);
            jsonParam.put("service_id", service_id);
            jsonParam.put("merchant_no", merchant_no);
            jsonParam.put("terminal_id", terminal_id);
            jsonParam.put("terminal_trace", terminal_trace);
            jsonParam.put("terminal_time", terminal_time);
            jsonParam.put("auth_no", auth_no);
            jsonParam.put("total_fee", total_fee);
            //TODO:签名加密
            String key_sign = MD5.sign("pay_ver=" + pay_ver + "&pay_type=" + pay_type + "&service_id=" + service_id + "&merchant_no=" + merchant_no + "&terminal_id=" + terminal_id + "&terminal_trace=" + terminal_trace + "&terminal_time=" + terminal_time + "&auth_no=" + auth_no + "&total_fee=" + total_fee + "&access_token=" + access_token, "UTF-8");
            System.out.println(key_sign + "退款签名");
            jsonParam.put("key_sign", key_sign);
            System.out.println(prePay_url + "");
            String xmlText = tojson(prePay_url, jsonParam.toJSONString());
            posPrePayRe = (PosPrepayRe) JSON.parseObject(xmlText, PosPrepayRe.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return posPrePayRe;
        }
        }
  • 签名可以借鉴官方SDK的算法

向扫呗服务发送接口请POST发送参数

PostMan测试接口如下