4.jsapi对接-->上一篇教程(1)
本篇将要吧支付相关的内容展示处理,里面设计到的支付商户号和应用id都需要自行准备
public Object pay(){
String url="";
PlaceOrder placeOrder =new PlaceOrder();
placeOrder.setAppid(MINI_PAY_APPID);// 应用id
placeOrder.setMchid(MINI_PAY_MCHID);// 支付商户号
placeOrder.setDescription(”商品描述“);
placeOrder.setOut_trade_no(”订单号“);
placeOrder.setNotify_url(”http://api.xxxx.com/pay/notify“);// 异步通知地址,需要公网可以访问,测试可以使用内网穿透工具比如natapp等
// 下单金额
Amount amount =new Amount();
mount.setCurrency("CNY");
// 元转分
String totalFee = AmountUtil.changeY2F(orderItemByOrderNo.getActualAmount().toString());
amount.setTotal(Integer.valueOf(totalFee));
placeOrder.setAmount(amount);
//
Payer payer=new Payer();
payer.setSp_openid("openid 小程序用户openid");
placeOrder.setPayer(payer);
String json = JSON.toJSONString(placeOrder);
String httpPost = post(url,json );
// httpPost 就是返回结果
// 要想让小程序支付还是不够的
String prepayId = JSON.parseObject(httpPost).getString("prepay_id");
SortedMap<String, String> params = new TreeMap<>();
params.put("appId", appId);
params.put("nonceStr", RandomUuidUtil.getUUID());
params.put("package", "prepay_id=" + prepayId);
params.put("signType", "RSA");
params.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
String message = buildMessageMINI(params);
String sign = signMINI(message.getBytes("utf-8"));
params.put("paySign", sign);
// params就是小程序支付需要的参数
return params;
}
5 元转分的方法,因微信支付请求的金额的单位为分
/**
* 将元为单位的转换为分 替换小数点,支持以逗号区分的金额
* 比如:100¥转换为10000 1转换为100 1,000.00转换为100000
* @param amount
* @return
*/
public static String changeY2F(String amount){
//处理包含, ¥ 或者$的金额
String currency = amount.replaceAll("\\$|\\¥|\\,", "");
int index = currency.indexOf(".");
int length = currency.length();
Long amLong = 0L;
if(index == -1){
amLong = Long.valueOf(currency+"00");
}else if(length - index >= 3){
amLong = Long.valueOf((currency.substring(0, index+3)).replace(".", ""));
}else if(length - index == 2){
amLong = Long.valueOf((currency.substring(0, index+2)).replace(".", "")+0);
}else{
amLong = Long.valueOf((currency.substring(0, index+1)).replace(".", "")+"00");
}
return amLong.toString();
}
6、小程序加密
@SneakyThrows
public static String signMINI(byte[] message) {
// 加载商户私钥证书(privateKey:私钥字符串)
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(MINI_APP_PAY_KEY.getBytes(StandardCharsets.UTF_8)));
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(merchantPrivateKey);
sign.update(message);
return Base64Utils.encodeToString(sign.sign());
}
7、其他方法
static String buildMessageMINI(SortedMap<String, String> map) {
return map.get("appId") + "\n"
+ map.get("timeStamp") + "\n"
+ map.get("nonceStr") + "\n"
+ map.get("package") + "\n";
}