支付宝支付,支付宝手机网页支付
程序员文章站
2022-04-11 13:47:39
...
1.首先你需要与支付宝的蚂蚁金服建立合作关系然后进入开放平台
2.在开放平台中建立你的应用,我这里的应用已经创建好了,就不在演示了,这个也比较简单
3.在应用中添加你需要的功能,注意:添加的功能必须是审核通过的或者不需要审核可以直接使用的。下面是我的应用需要的功能。
4.设置应用相关配置信息。注明:如果你不开发小程序或者生活号可以不设置授权回调地址。
5.接下来是代码实现。
private final String APP_ID = "xxxxx"; //你创建的应用APPID
private final String APP_PRIVATE_KEY = "xxxx"; //你的应用的私钥
private final String CHARSET = "UTF-8";
private final String ALIPAY_PUBLIC_KEY = "xxxx"; //支付宝公钥
private final String SIGN_TYPE = "RSA2"; //加密方式
//第一步,启动支付收银台,页面由支付宝SDK输出已定好的页面代码
@RequestMapping(value = "/doPayPage")
public void doPayPage(HttpServletResponse httpResponse,@RequestParam String total_amount,@RequestParam String mark, String clubId) throws AlipayApiException, IOException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //获得初始化的AlipayClient
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl("http://zyl.xxxxx.cn/zyl/jsp/integral_recharge.jsp");//回跳地址
alipayRequest.setNotifyUrl("http://zyl.xxxxx.cn/zyl/alipay/callBack.do");//通知地址
String passback_params = getLoginUser().getId() + "&" + mark;
if(null != clubId && !"".equals(clubId)) {
passback_params += clubId;
}
String content = "{" +
" \"out_trade_no\":\""+System.currentTimeMillis()+"\"," +
" \"total_amount\":0.01," +
" \"subject\":\"zyl\"," +
" \"passback_params\":"+passback_params+""+
" }";
alipayRequest.setBizContent(content);//填充业务参数
String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
httpResponse.setContentType("text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
}
/** 此接口为上面第一步,通知回调地址请求接口,次接口支付宝会将支付结果反馈的次接口,通过此接口可知道支付是否完成
* @param total_amount 订单金额
* @param trade_no 支付宝交易号
* @param subject 订单标题
* @param sign_type 签名类型
* @param trade_status 交易状态 [WAIT_BUYER_PAY 交易创建,等待买家付款;
* TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款;
* TRADE_SUCCESS 交易支付成功;
* TRADE_FINISHED 交易结束,不可退款]
* @param sign 签名
* @param app_id 开发者的app_id
* @param notify_time 通知时间
* @param notify_id 通知校验ID
* @param out_trade_no 商户订单号
* @param buyer_id 买家支付宝用户号 ( 说明:买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字,如:2088102122524333)
* @param buyer_logon_id 买家支付宝账号 (说明:买家支付宝账号,如:15901825620)
* @param receipt_amount 实收金额
* @param buyer_pay_amount 付款金额
* @param gmt_payment 交易付款时间
* @throws IOException
*/
@RequestMapping(value = "/callBack",method = RequestMethod.POST)
public void callBack(HttpServletRequest request,HttpServletResponse response) throws IOException{
Map<?, ?> paramsMap = request.getParameterMap();
Map<String, String> map = null;
if(null != paramsMap){
System.out.println("##################打印参数开始###########################");
// String str = "";
map = new HashMap<String, String>();
for (Object key : paramsMap.keySet()) {
map.put((String) key, request.getParameter(key.toString()));
System.out.println(key+":"+request.getParameter(key.toString()));
// String as = key+"="+request.getParameter(key.toString());
// str += as +"&";
}
// System.out.println("##################parms>"+str+"############################");
System.out.println("##################打印参数结束############################");
try {
boolean signVerified = AlipaySignature.rsaCheckV1(map, ZFB_PUBLI_KEY, CHARSET, SIGN_TYPE); //调用SDK验证签名
if(signVerified){
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
String trade_status = map.get("trade_status");
String total_amount = map.get("total_amount"); //订单金额
String trade_no = map.get("trade_no"); //支付宝交易号
String app_id = map.get("app_id");
String out_trade_no = map.get("out_trade_no"); //商户订单号
String buyer_logon_id = map.get("buyer_logon_id"); //买家支付宝账号
String buyer_pay_amount = map.get("buyer_pay_amount"); //付款金额
String gmt_create = map.get("gmt_create"); //交易创建时间
String gmt_payment = map.get("gmt_payment"); //交易付款时间
String notify_id = map.get("notify_id"); //通知校验ID
String passback_params = map.get("passback_params");
String[] myselfParams = passback_params.split("&");
int userId = Integer.valueOf(myselfParams[0]);
//此处做你的相应的业务逻辑处理
response.getWriter().println("success");
return;
}
else
{
// TODO 验签失败则记录异常日志,并在response中返回failure.
response.getWriter().println("failure");
return ;
}
} catch (Exception e) {
e.printStackTrace();
response.getWriter().println("failure");
return ;
}
}
response.getWriter().println("failure");
}
希望对有需要的人,能够提供帮助。 上一篇: iOS - UIWindow和view控制器的创建
下一篇: laravel控制器