支付宝使用spring mvc在服务器端生成订单和签名信息
我们知道在使用支付宝的支付中,会需要我们生成这个订单,还要需要对订单排序签名,只有这两个信息生成客户端才可以进行调用SDK进行通信,进行调用支付宝。之前我介绍过如何生成支付宝在springMVC中如何生成签名,不过由于在客户端生成订单,没有把订单信息进行保存,在异步回调的时候无法查询订单信息,存在弊端,为了解决这个问题,我把生成订单和生成签名信息放到服务器里面,如果对我的文章有兴趣,欢迎订阅我的头条号,一点热,yeehot.com
此外要注意一点,就是移动支付是需要企业申请的才可以使用的,如果是个人应该申请不通过。
关于移动支付的SDK大家可以在官网下载。
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.M7O36T&treeId=54&articleId=104509&docType=1
服务器搭建部分
1、创建一个spring MVC项目:
这里我就暂时不做介绍了,我在之前的文章已经说得比较详细了。
IntelliJ IDEA搭建springmvc项目图文介绍
2、完成上面的操作后,我们可以做一下生成订单的操作。
// 合作身份者id,以2088开头的16位纯数字
publicstaticfinal String DEFAULT_PARTNER = "你的合作身份ID";
String orderInfo;
publicstaticfinal String DEFAULT_SELLER = "你的收款账号";
private String getOrderInfo(String subject, String body, String price,
String orderinfo) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + DEFAULT_PARTNER + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + DEFAULT_SELLER + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + orderinfo + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 商品金额
// orderInfo += "&memberinfo=" + "\"" + "kaopuvip_0001" + "\"";
// 商品金额
// orderInfo += "&uid=" + "\"" + myuser.getUid() + "\"";
// 服务器异步通知页面路径
// orderInfo += "¬ify_url=" + "\"" +
// "http://notify.msp.hk/notify.htm" + "\"";
String nurl = "";
try {
nurl = URLEncoder.encode(
"http://www.yeehot.com/ming/pay/zfbnotify",
"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
orderInfo += "¬ify_url=" + "\"" + nurl + "\"";
// 服务接口名称, 固定值
orderInfo += "&service=\"mobile.securitypay.pay\"";
// 支付类型, 固定值
orderInfo += "&payment_type=\"1\"";
// 参数编码, 固定值
orderInfo += "&_input_charset=\"utf-8\"";
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += "&it_b_pay=\"30m\"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";
return orderInfo;
}
private String getOutTradeNo() {
SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss");
Date date = new Date();
String key = format.format(date);
java.util.Random r = new java.util.Random();
key += r.nextInt();
// key = key.substring(0, 15);
key = key.substring(0, 15);
key = key + "";
key = key;
// Log.d(TAG, "outTradeNo: " + key);
return key;
}
3、设计spring mvc访问页面,我们提供了四个参数,用户名,商品名称,商品详情,商品价格的参数传递,由于商品名称和商品价格可能存在中文,所以我们需要把字符转码和解码。同时我们还需要把订单信息保存到数据库,用来在异步回调的时候做一个验证。最后,我们通过json的格式返回我们的sign和订单数据。
@ResponseBody
@RequestMapping(value = "/pay/zhifubao/payinfo", produces = "application/json; charset=utf-8")
public String zhifusign(String username, String subject, String body, String price) {
if (subject != null) {
try {
subject = URLDecoder.decode(subject, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (body != null) {
try {
body = URLDecoder.decode(body, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
String tradeno = getOutTradeNo();
String order = getOrderInfo(subject, body, price, tradeno);
String ordersign = RSA.sign(order, AlipayConfig.private_key,
AlipayConfig.input_charset);
{
ZFBINFO tradeInfo = new ZFBINFO();
tradeInfo.setAddtime(new Timestamp(System.currentTimeMillis()));
tradeInfo.setUsername(username);
tradeInfo.setBody(body);
tradeInfo.setFee(price);
tradeInfo.setSubject(subject);
tradeInfo.setIsfinish(1);
tradeInfo.setTradeNo(tradeno);
tradeInfoManager.addKpTradeInfo(tradeInfo);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("sign", ordersign);
jsonObject.put("order", order);
return jsonObject.toString();
}
关于异步回调这里,我就不做解释,今天的课程就讲到这里,如果有什么疑惑,欢迎留言咨询,我看到评论的时候就会为大家解答。
欢迎继续关注我的头条号:一点热,www.yeehot.com
欢迎大家收藏与转发,如果转载到其它网站,请与我联系.