概述:最近在研发一款收银软件,需要用到扫呗支付,为此把我踩的坑分享给大家
准备资料
- 商户号
- 终端号
- access_token
- www.lcsw.cn/doc/api/pay… (扫呗官网支付API)
- www.lcsw.cn/fusesdk.htm… (扫呗官网SDK)
研究官网API
- 请求扫呗路径
- 注意路径的端口为8045,官网给的8010端口是错的(一致以为自己的思路是错的),问了扫呗技术人员端口为8045。 test.lcsw.cn:8045/lcsw
- 生成签名(注意参数的拼接顺序)
- 本次开发的是付款码支付
- 所以请求扫呗服务器地址为 test.lcsw.cn:8045/lcsw/pay/10…
- 要特别注意每一个参数的意义,和用法
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的算法