支付宝扫码支付
扫码支付代码记录
1、支付宝依赖
<!-- alipay sdk 支付依赖 --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.13.0.ALL</version> </dependency> <!--依赖支付的空判断--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> </dependency> <!--二维码生成--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <!--加密依赖--> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> <!--http请求--> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>
2、生成支付图片
参数:money为用户自己输入的充值金额 ,token为用户的key
public byte[] alipay(String money,String token) { try { // 业务数据 // 1:支付的用户 //String enterpriseId = token.substring(0,44); EnterpriseAccount account = enterpriseAccount.getAccountByToken(token); // 2: 支付金额 // 3: 支付的产品 String title = "xxxx充值!"; // 4: 支付的订单编号 String orderNumber = utils.getUUID(); // 5:支付宝携带的参数在回调中可以通过request获取 JSONObject json = new JSONObject(); json.put("enterpriseId", account.getEnterpriseId()); //json.put("orderNumber", orderNumber); json.put("money", money); json.put("ptype","prepaid");// 支付类型 预支付 //json.put("packageId",enterprisePackage.getId()); String params = json.toString(); // 支付信息的参数 // 6:设置支付相关的信息 AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); model.setOutTradeNo(orderNumber); // 自定义订单号 model.setTotalAmount(money);// 支付金额 model.setSubject(title);// 支付的产品名称 model.setBody(params);// 支付的请求体参数 model.setTimeoutExpress("30m");// 支付的超时时间 model.setStoreId(account.getEnterpriseId()+"");// 商户门店编号 QrCodeResponse qrCodeResponse = qrcodePay(model); //7 二维码合成 ByteArrayOutputStream output = new ByteArrayOutputStream(); String logopath = ""; try { logopath = ResourceUtils.getFile("classpath:static/favicon.png").getAbsolutePath(); }catch (Exception ex){ logopath = new java.io.File("static/favicon.png").getAbsolutePath(); } BufferedImage buffImg = QRCodeUtil.encode(qrCodeResponse.getQr_code(), logopath, false);//获取二维码 ImageOutputStream imageOut = ImageIO.createImageOutputStream(output); ImageIO.write(buffImg, "JPEG", imageOut); imageOut.close(); ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); return FileCopyUtils.copyToByteArray(input); } catch (Exception ex) { ex.printStackTrace(); return null; } } /** * 扫码运行代码 * 验签通过返回QrResponse * 失败打印日志信息 * 参考地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay * * @param model * @return */ public QrCodeResponse qrcodePay(AlipayTradePrecreateModel model) { // 1: 获取阿里请求客户端 AlipayClient alipayClient = getAlipayClient(); // 2: 获取阿里请求对象 AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); // 3:设置请求参数的集合,最大长度不限 request.setBizModel(model); // 设置异步回调地址 request.setNotifyUrl(notify_url); // 设置同步回调地址 request.setReturnUrl(return_url); AlipayTradePrecreateResponse alipayTradePrecreateResponse = null; try { alipayTradePrecreateResponse = alipayClient.execute(request); } catch (AlipayApiException e) { e.printStackTrace(); } QrResponse qrResponse = JSON.parseObject(alipayTradePrecreateResponse.getBody(), QrResponse.class); return qrResponse.getAlipay_trade_precreate_response(); } /** * 获取AlipayClient对象 * * @return */ private AlipayClient getAlipayClient() { AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, app_id, merchant_private_key, "JSON", charset, alipay_public_key, sign_type); //获得初始化的AlipayClient return alipayClient; }
从nacos配置中心获取支付宝参数
import org.springframework.beans.factory.annotation.Value; public class AlipayConfig { // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 @Value("${alipay.app_id:}") public String app_id; // 商户私钥,您的PKCS8格式RSA2私钥 @Value("${alipay.merchant_private_key:}") public String merchant_private_key; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 @Value("${alipay.alipay_public_key:}") public String alipay_public_key; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 @Value("${alipay.notify_url:}") public String notify_url; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 @Value("${alipay.return_url:}") public String return_url; // 签名方式 @Value("${alipay.sign_type:}") public String sign_type; // 字符编码格式 @Value("${alipay.charset:}") public String charset; // 支付宝网关 @Value("${alipay.gatewayUrl:}") public String gatewayUrl; // 日志存放 @Value("${alipay.log_path:}") public String log_path; }
3、给支付宝设定的回调函数
当扫码支付后,支付宝调用回调函数把支付信息返回。
@RequestMapping("enterprisePay/notifyUrl") public String notifyUrl(HttpServletRequest request) throws Exception { // 1: 调用支付回调 boolean result = enterprisePayCallback(request); if (result) { return "success"; // 请不要修改或删除 } else { // 验证失败 return "fail"; } } private boolean enterprisePayCallback(HttpServletRequest request) throws UnsupportedEncodingException { // 1:获取支付宝GET过来反馈信息 Map<String, String> params = new HashMap<String, String>(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, new String(valueStr.getBytes("ISO-8859-1"), "UTF-8")); } //2:计算得出通知验证结果 // 返回公共参数 String tradeno = params.get("trade_no"); //支付返回的请求参数body String bodyJson = params.get("body"); System.out.println(bodyJson); try { JSONObject bodyJsonObject = JSONObject.parseObject(bodyJson); String enterpriseId = bodyJsonObject.getString("enterpriseId"); String ptype = bodyJsonObject.getString("ptype"); // 课程支付成功,保存的订单交易明细 // 支付类型为 预支付 的操作 if(ptype!=null && ptype.equalsIgnoreCase("prepaid")){ // 支付完成需要保存的一些信息 payCommonService.payprepaid(bodyJsonObject,enterpriseId,tradeno); } } catch (Exception ex) { ex.printStackTrace(); return false; } return true; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?