支付宝支付(网站支付,APP支付,扫码支付) Java服务端代码

来源:互联网 发布:linux rpm和yum 编辑:程序博客网 时间:2024/04/30 15:26

AlipayController

import java.util.Calendar;import java.util.HashMap;import java.util.Map;import java.util.Set;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.alipay.api.AlipayApiException;import com.alipay.api.AlipayClient;import com.alipay.api.domain.AlipayTradeAppPayModel;import com.alipay.api.internal.util.AlipaySignature;import com.alipay.api.request.AlipayTradeAppPayRequest;import com.alipay.api.request.AlipayTradePagePayRequest;import com.alipay.api.request.AlipayTradeWapPayRequest;import com.alipay.api.response.AlipayTradeAppPayResponse;import com.message.AlipayPayRequest;import com.redis.utils.RedisUtil;import com.utils.AlipayConfig;import com.utils.HttpClientUtils;@Controller@RequestMapping(value = "/alipay")public class AlipayController {//公众号支付(网站支付)@RequestMapping(value = "/wapPay", produces = "text/html;charset=UTF-8", method = RequestMethod.POST)public void wapPay(AlipayPayRequest request, HttpServletResponse httpResponse) {if (request.getUid() != 0 && request.getItemId() != null) {int money = 0 ;//充值金额String querywolfurl = AlipayConfig.diamond_url;//公众号充值钻石表String string = HttpClientUtils.executePost(querywolfurl, null, "utf-8");//充值表,使用了一个自定义的post请求JSONArray jsona = JSONArray.parseArray(string);if (jsona.size() > 0) {for (int i = 0; i < jsona.size(); i++) {JSONObject job = jsona.getJSONObject(i);if ((job.getString("recharge_price_id")).equals(request.getItemId())) {money = Integer.parseInt(job.getString("amount").substring(0, job.getString("amount").indexOf(".")));break;}}}long timeStart = Calendar.getInstance().getTimeInMillis();String out_trade_no = request.getUid() + "_" + timeStart;// 订单号AlipayClient alipayClient = AlipayConfig.getAlipayClient(); // 获得初始化的AlipayClientAlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();// 创建API对应的requestalipayRequest.setReturnUrl(AlipayConfig.return_url);// 付款成功后,页面重定向通知alipayRequest.setNotifyUrl(AlipayConfig.notify_url);// 服务器通知Map<String, Object> map = new HashMap<String, Object>();map.put("out_trade_no", out_trade_no);// 订单号map.put("total_amount", money);// 交易金额,单位:元map.put("subject", request.getSubject());// 订单标题map.put("product_code", "QUICK_WAP_PAY");// 销售产品码map.put("timeout_express", "90m");// 该笔订单允许的最晚付款时间,逾期将关闭交易alipayRequest.setBizContent(JSON.toJSONString(map));try {String form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单System.err.println(form);httpResponse.setContentType("text/html;charset=" + AlipayConfig.CHARSET);httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面httpResponse.getWriter().flush();RedisUtil.setValueTime(out_trade_no, "1", 2 * 24 * 60 * 60);//创建订单保存2天有限期} catch (Exception e) {e.printStackTrace();}}}// APP支付@ResponseBody@RequestMapping(value = "/appPay", method = RequestMethod.POST)public String appPay(AlipayPayRequest request) {if (request.getUid() != 0 && request.getItemId() != null) {//app端的充值表放在redis中JSONArray json = JSONArray.parseArray(RedisUtil.getByKey("RechargeMeter"));String money = "" ;//充值金额if (json.size() > 0) {for (int i = 0; i < json.size(); i++) {JSONObject job = json.getJSONObject(i);if ((job.getString("itemId")).equals(request.getItemId())){money = (String) job.get("money");break;}}}if(money.equals("")){//支付的商品id不存在,返回异常信息return JSON.toJSONString("error");}long timeStart = Calendar.getInstance().getTimeInMillis();String out_trade_no = request.getUid() + "_" + timeStart;// 订单号// 实例化客户端AlipayClient alipayClient = AlipayConfig.getAlipayClient(); // 获得初始化的AlipayClient// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.payAlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setSubject(request.getSubject());model.setOutTradeNo(out_trade_no);model.setTimeoutExpress("30m");model.setTotalAmount(money);model.setProductCode("QUICK_MSECURITY_PAY");alipayRequest.setBizModel(model);alipayRequest.setNotifyUrl(AlipayConfig.APPnotify);try {// 这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse alipayResponse = alipayClient.sdkExecute(alipayRequest);System.out.println(alipayResponse.getBody());// 就是orderString可以直接给客户端请求,无需再做处理。RedisUtil.setValueTime(out_trade_no, "1", 2 * 24 * 60 * 60);//创建订单保存2天有限期return alipayResponse.getBody();} catch (AlipayApiException e) {e.printStackTrace();}}return null;}// 扫码支付@ResponseBody@RequestMapping(value = "/pagePay", produces = "text/html;charset=UTF-8", method = RequestMethod.POST)public String pagePay(AlipayPayRequest request) {if (request.getUid() != 0 && request.getItemId() != null) {int money = 0 ;//充值金额String querywolfurl = AlipayConfig.diamond_url;//公众号充值钻石表String string = HttpClientUtils.executePost(querywolfurl, null, "utf-8");//充值表JSONArray jsona = JSONArray.parseArray(string);if (jsona.size() > 0) {for (int i = 0; i < jsona.size(); i++) {JSONObject job = jsona.getJSONObject(i);if ((job.getString("recharge_price_id")).equals(request.getItemId())) {money = Integer.parseInt(job.getString("amount").substring(0, job.getString("amount").indexOf(".")));break;}}}long timeStart = Calendar.getInstance().getTimeInMillis();String out_trade_no = request.getUid() + "_" + timeStart;// 订单号AlipayClient alipayClient = AlipayConfig.getAlipayClient(); // 获得初始化的AlipayClientAlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();// 创建API对应的requestalipayRequest.setReturnUrl(AlipayConfig.OWreturn_url);// 回跳地址alipayRequest.setNotifyUrl(AlipayConfig.OWnotify_url);// 通知地址Map<String, Object> map = new HashMap<String, Object>();map.put("out_trade_no", out_trade_no);// 订单号map.put("product_code", "FAST_INSTANT_TRADE_PAY");// 销售产品码map.put("total_amount", money);// 交易金额,单位:元map.put("subject", "钻石");// 订单标题alipayRequest.setBizContent(JSON.toJSONString(map));try {String form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单System.out.println("---------支付宝扫码---------> " + form);// 就是orderString可以直接给客户端请求,无需再做处理。RedisUtil.setValueTime(out_trade_no, "1", 2 * 24 * 60 * 60);//创建订单保存2天有限期return form;} catch (AlipayApiException e) {e.printStackTrace();}}return null;}// 公众号(网站)--支付成功后回调方法@RequestMapping(value = "/notify", method = RequestMethod.POST)public void notify(HttpServletRequest request, HttpServletResponse httpResponse) {// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();Set<String> keySet = requestParams.keySet();String out_trade_no = "";String trade_status = "";String total_amount = "";for (String key : keySet) {StringBuffer buffer = new StringBuffer();for (String string : requestParams.get(key)) {buffer.append(string);}params.put(key, buffer.toString());if (key.equals("out_trade_no")) {out_trade_no = buffer.toString();// 商户订单号System.out.println(key + " : " + buffer.toString());} else if (key.equals("trade_status")) {trade_status = buffer.toString();// 交易状态System.out.println(key + " : " + buffer.toString());} else if (key.equals("total_amount")) {total_amount = buffer.toString().substring(0,buffer.toString().length()-3) + "";// 充值金额System.out.println(key + " : " + total_amount);}}try {// 计算得出通知验证结果boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);if (verify_result) {// 验证成功if (trade_status.equals("TRADE_SUCCESS")) { // 交易支付成功boolean contains = RedisUtil.getAllkeys().contains(out_trade_no);if((contains && !RedisUtil.getByKey(out_trade_no).equals("3")) || !contains){RedisUtil.setValue(out_trade_no, "2");// 支付成功,未加钻石//获取订单信息,传到业务层,修改数据库String uid = out_trade_no.substring(0, out_trade_no.indexOf("_"));int diamond = 0;// 钻石String querywolfurl = AlipayConfig.diamond_url;//公众号充值钻石表String string = HttpClientUtils.executePost(querywolfurl, null, "utf-8");//充值表JSONArray jsona = JSONArray.parseArray(string);if (jsona.size() > 0) {for (int i = 0; i < jsona.size(); i++) {JSONObject job = jsona.getJSONObject(i);if (job.getString("amount").substring(0, job.getString("amount").indexOf(".")).equals(total_amount)) {diamond = Integer.parseInt(job.getString("jewel_amount"));// 钻石break;}}}System.out.println("diamond : "+ diamond);//........if(修改数据库失败){System.out.println("增加钻石失败--网络异常");}else{RedisUtil.setValue(out_trade_no, "3");// 增加钻石成功System.out.println("增加钻石成功");httpResponse.getWriter().println("success");}}}} else {// 验证失败httpResponse.getWriter().println("fail");}} catch (Exception e) {e.printStackTrace();}}// APP--支付成功后回调方法@RequestMapping(value = "/APPnotify", method = RequestMethod.POST)public void APPnotify(HttpServletRequest request, HttpServletResponse httpResponse) {// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();Set<String> keySet = requestParams.keySet();String out_trade_no = "";String trade_status = "";String total_amount = "";for (String key : keySet) {StringBuffer buffer = new StringBuffer();for (String string : requestParams.get(key)) {buffer.append(string);}params.put(key, buffer.toString());if (key.equals("out_trade_no")) {out_trade_no = buffer.toString();// 商户订单号System.out.println(key + " : " + buffer.toString());} else if (key.equals("trade_status")) {trade_status = buffer.toString();// 交易状态System.out.println(key + " : " + buffer.toString());} else if (key.equals("total_amount")) {total_amount = buffer.toString().substring(0,buffer.toString().length()-3) + "";// 充值金额System.out.println(key + " : " + total_amount);}}try {// 计算得出通知验证结果boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);if (verify_result) {// 验证成功if (trade_status.equals("TRADE_SUCCESS")) { // 交易支付成功boolean contains = RedisUtil.getAllkeys().contains(out_trade_no);if((contains && !RedisUtil.getByKey(out_trade_no).equals("3")) || !contains){RedisUtil.setValue(out_trade_no, "2");// 支付成功,未加钻石//获取订单信息,传到业务层,修改数据库String uid = out_trade_no.substring(0, out_trade_no.indexOf("_"));JSONArray json = JSONArray.parseArray(RedisUtil.getByKey("RechargeMeter"));int diamond = 0;if (json.size() > 0) {for (int i = 0; i < json.size(); i++) {JSONObject job = json.getJSONObject(i);if (job.get("money").equals(total_amount)) {diamond = Integer.parseInt((String) job.get("ADiamonds"));break;}}}System.out.println("diamond : "+ diamond);//........if(修改数据库失败){System.out.println("增加钻石失败--网络异常");}else{RedisUtil.setValue(out_trade_no, "3");// 增加钻石成功System.out.println("增加钻石成功");httpResponse.getWriter().println("success");}}}} else {// 验证失败httpResponse.getWriter().println("fail");}} catch (Exception e) {e.printStackTrace();}}// 扫码--支付成功后回调方法@RequestMapping(value = "/OWnotify", method = RequestMethod.POST)public void OWnotify(HttpServletRequest request, HttpServletResponse httpResponse) {// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();Set<String> keySet = requestParams.keySet();String out_trade_no = "";String trade_status = "";String total_amount = "";for (String key : keySet) {StringBuffer buffer = new StringBuffer();for (String string : requestParams.get(key)) {buffer.append(string);}params.put(key, buffer.toString());if (key.equals("out_trade_no")) {out_trade_no = buffer.toString();// 商户订单号System.out.println(key + " : " + buffer.toString());} else if (key.equals("trade_status")) {trade_status = buffer.toString();// 交易状态System.out.println(key + " : " + buffer.toString());} else if (key.equals("total_amount")) {total_amount = buffer.toString().substring(0,buffer.toString().length()-3) + "";// 充值金额System.out.println(key + " : " + total_amount);}}try {// 计算得出通知验证结果boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);if (verify_result) {// 验证成功if (trade_status.equals("TRADE_SUCCESS")) { // 交易支付成功boolean contains = RedisUtil.getAllkeys().contains(out_trade_no);if((contains && !RedisUtil.getByKey(out_trade_no).equals("3")) || !contains){RedisUtil.setValue(out_trade_no, "2");// 支付成功,未加钻石//获取订单信息,传到业务层,修改数据库String uid = out_trade_no.substring(0, out_trade_no.indexOf("_"));int diamond = 0;// 钻石String querywolfurl = AlipayConfig.diamond_url;//公众号充值钻石表String string = HttpClientUtils.executePost(querywolfurl, null, "utf-8");//充值表JSONArray jsona = JSONArray.parseArray(string);if (jsona.size() > 0) {for (int i = 0; i < jsona.size(); i++) {JSONObject job = jsona.getJSONObject(i);if (job.getString("amount").substring(0, job.getString("amount").indexOf(".")).equals(total_amount)) {diamond = Integer.parseInt(job.getString("jewel_amount"));// 钻石break;}}}System.out.println("diamond : "+ diamond);//........if(修改数据库失败){System.out.println("增加钻石失败--网络异常");}else{RedisUtil.setValue(out_trade_no, "3");// 增加钻石成功System.out.println("增加钻石成功");httpResponse.getWriter().println("success");}}}} else {// 验证失败httpResponse.getWriter().println("fail");}} catch (Exception e) {e.printStackTrace();}}}


AlipayPayRequest 支付请求的参数

public class AlipayPayRequest {private long uid;//用户的uidprivate String itemId;// 充值商品idprivate String subject;// 订单标题//并提供get/set方法

AlipayConfig

import com.alipay.api.AlipayClient;import com.alipay.api.DefaultAlipayClient;/** * 获取初始化的AlipayClient * 包括沙箱及正式版(网关地址,APPID,私钥,公钥均不同)*/public class AlipayConfig {//网关地址//public static final String URL = "https://openapi.alipay.com/gateway.do"; //(正式环境)public static final String URL = "https://openapi.alipaydev.com/gateway.do"; //沙箱(测试环境)//APPID        public static final String ALIPAY_APPID = "<公司应用的APPID>";         //私钥public static String APP_PRIVATE_KEY = "<使用开放平台提供的工具生成>";//支付宝公钥public static String ALIPAY_PUBLIC_KEY = "<使用开放平台提供的工具生成>";//签名算法类型(根据生成私钥的算法,RSA2或RSA)public static final String SIGNTYPE = "RSA";public static final String FORMAT = "json";//请求数据格式public static final String CHARSET = "utf-8";//编码集// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static final String notify_url = "http://....../alipay/notify";//公众号public static final String APPnotify = "http://....../alipay/APPnotify";//APPpublic static final String OWnotify_url = "http://....../alipay/OWnotify";//网站扫码// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址public static final String return_url = "https://www.xxx.com/";public static final String OWreturn_url = "https://www.xxx.com/";//网站扫码public static final String diamond_url = "http://www.xxx.com/GetRechergePrice";//公众号充值钻石表(这里是从另一个服务器获取的,也可以存在redis或数据库中)    // 统一收单交易创建接口    private static AlipayClient alipayClient = null;    /**获得初始化的AlipayClient     * @return 支付宝客户端     */    public static AlipayClient getAlipayClient() {        if (alipayClient == null) {            synchronized (AlipayConfig.class) {                if (null == alipayClient) {                    alipayClient = new DefaultAlipayClient(URL, ALIPAY_APPID, APP_PRIVATE_KEY, FORMAT, CHARSET,ALIPAY_PUBLIC_KEY,SIGNTYPE);                }            }        }        return alipayClient;    }}


阅读全文
1 0
原创粉丝点击