支付宝服务器 java_Java服务器端支付宝支付的实现

本文主要是实现APP端唤起支付宝支付并完成订单的功能实现

准备

下载最新的官方Demo传送门

下载好后找到WS_APP_PAY_SDK_BASE_2.0\客户端Demo\AndroidDemo_2.0(SDK版本15.2.7)\AndroidDemo_2.0\alipay_demo\src\com\alipay\sdk\pay\demo\util目录下的OrderInfoUtil2_0.java文件,我们主要会用到它,把它复制到自己项目中

还有就是对接的支付宝商户账号需要在蚂蚁金服开放平台中创建好应用

a7879019c8cdddd3da77f31ac4a33e3d.png

申请成功的应用列表

并且在【应用环境】中设置好【应用网关】(我这是项目的域名)和【授权回调地址】(接收支付成功通知的URL),还有生成并设置好公私钥(具体不详细说明,总之用官方的工具生成的公私钥要三个:rsa_private_key.pem、rsa_private_key_pkcs8.pem、rsa_public_key.pem,Java服务器端主要用到rsa_private_key_pkcs8.pem中的内容,代码中公私钥都不需要包含头尾),之后去申请【APP支付】的功能

73f5a1f62afcb61437143fe61b1de806.png

申请成功的功能信息列表

一切准备好了之后你应该有了以下参数

参数

内容

APPID

形如2016022100609211

AES密钥

长度为24的随机字符串

应用公钥

长度为216的随机字符串(可能长度不一定)

支付宝公钥

长度为216的随机字符串(可能长度不一定)

支付宝私钥

长度为848的随机字符串(可能长度不一定)

支付宝PID(商户号)

形如2088521140216627

唤起支付宝支付

将OrderInfoUtil2_0中的buildOrderParamMap方法修改一下,让他接收总金额total_amount、商品标题subject、交易信息body,如果需要还可以加上passback_params,我这里就加了,修改之后的buildOrderParamMap方法是这样的(CryptoTool是一个我自己定义的加密器)

public static MapbuildOrderParamMap(String app_id,

String total_amount, String subject, String body, String out_trade_no, CryptoTool cryptoTool) {

MapkeyValues = new LinkedTreeMap();

keyValues.put("app_id", app_id);

String passback_params = cryptoTool.encode(out_trade_no);

try {

passback_params = URLEncoder.encode(passback_params, "UTF-8");

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

passback_params = "error";

System.out.println("buildOrderParamMap未找到此编码");

}

keyValues.put("biz_content", "{\"seller_id\":\""+Constant.ALI_SELLER_ID+

"\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\""+total_amount+"\",\"subject\":\""+subject+"\",\"body\":\""+body+"\",\"passback_params\":\""+

passback_params+"\",\"out_trade_no\":\"" + out_trade_no + "\"}");

keyValues.put("charset", "utf-8");

keyValues.put("method", "alipay.trade.app.pay");

keyValues.put("notify_url", Constant.NOTIFY_URL);

keyValues.put("sign_type", "RSA");

keyValues.put("timestamp", DateTool.all(new java.sql.Date(System.currentTimeMillis())));

keyValues.put("version", "1.0");

return keyValues;

}

之后我们在action中进行调用

//你自己的订单编号

String out_trade_no = "12345678";

//传入一些订单相关的参数

Mapparams = OrderInfoUtil2_0.buildOrderParamMap("你自己的支付宝APPID", "0.01", "大标题", "订单内容", out_trade_no, cryptoTool);

//对参数进行一些处理

String orderParam = OrderInfoUtil2_0.buildOrderParam(params);

//生成签名

String sign = OrderInfoUtil2_0.getSign(params, Constant.ALI_PRIVATE);

final String orderInfo = orderParam + "&" + sign;

System.out.println("orderInfo");

System.out.println(orderInfo);

//将处理好的orderInfo传给APP

HttpServletResponse response = AppTool.getResponse();

PrintWriter out = response.getWriter();

out = response.getWriter();

out.write(orderInfo);

out.flush();

out.close();

生成的支付宝订单

之后访问这个action将会获得到一串字符串

app_id=2016111112506666&biz_content=%1B%52seller_id%12%3B%222055621140638888%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3a%22%e4%bd%a0%e7%9a%84%e6%a0%87%e9%a2%98%22%2c%22body%22%3a%22%e8%ae%a2%e5%8d%95%e8%af%a6%e6%83%85%e5%86%85%e5%ae%b9%22%2c%22passback_params%22%3a%22%252Bwq6HOPXA3j12345p4auuyF4h%252FkYUZOJTC1rGY7w%253D%253D%22%2c%22out_trade_no%22%3a%22f8cc41fe58b8333360004%22%7d&charset=utf-8&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fbaidu.com%3A9527%2Ftest%2FalipayCallback&sign_type=RSA&timestamp=2016-12-01+14%3A42%3A07&version=1.0&sign=iYH5gDau0WX4MxYuGLA0q%2FOiyW64rG315AKrJEZOSCrbP8MEN3wYNESxFpsVKVL%2BJ16kebb9M5U%2BAkWR7fyL%2BLDzq%2BrWL3odRqLqYuHnUh2Xq%2FaXYWJRsF1T%2FCxpsCsWaBFgrxt8OgAzKxwEVTXS10HHtDNtnrwufgE%2BAjUq4Wc%3D

之后让前端同事把官方的Demo下载下来,PayDemoActivity的东西修改并获取你刚刚生成的orderInfo就可以啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值