支付宝扫码支付
作者:互联网
扫码支付代码记录
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;
}
标签:alipay,支付宝,扫码,return,String,支付,model,public 来源: https://blog.csdn.net/m0_49044558/article/details/122235706