https://gitee.com/roncoocom/roncoo-pay
https://gitee.com/binary/weixin-java-tools
demo:
xml
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.3.4.ALL</version>
</dependency>
AlipayConfig :
package com.cn.config;
public class AlipayConfig {
// 合作身份者ID,以2088开头由16位纯数字组成的字符串
public static String partner = "2088231174768559";
// 商户的私钥,使用支付宝自带的openssl工具生成。
public static String private_key="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDfEYuCm08Lvtdsoj6noTJ8UjuNnlRJ7S34CuZYJB38geNSNoUJ3lCb1Pj12eF8md7O84Np5dzHeLeuElORHelvvzxjvpJ1gQcKXrtMvOQdgA84syYOKxCKLvsL5ek5kUqgmxSE2wR9TfDOCSIukn+ZYltMa9haXSqI4+uuxyKUeJTJ1nsrEs9hkHPKvTrVrHi0z9nG0DlCLbWZdjQ7imEo5GDRng/JoOD27rwNEPtK6u/KL9DAErVRab8pLB1NyzpL+jJcMuNUY5NYBHc/0b3N8D9Nj3PXkG6rhRWvhmY04lpvGoGKEgSHKR9MdgCzj15h6iyCDwNW3FOeLNYAZzJFAgMBAAECggEBAIK6vZAlhQXVKls4GpATIItLhitRBwTsQ2yCtswhHpHFbXvZB87ow0UQY3dx4XwskS+n9vQxClq8nKkfhGofpZcf9Dxgi2Th4UZqjkpCyU2gp0sLctoK0v6o2ef3Ld/XDm1hdX0G/nKRIvcc0zOIF8/EnM0Exx7uSuc+6/jaK6HmkOh0KNB6NzvHoOid0ZNPTwYlCLStn4b3Q2zFAt2PI4dAHMgvkFdu0rfdHP5wzKVKPHPfb1j9eC3n13ti6rTrPFsVXB4u2YhBGY/8G2UKC05io/5PrvEMigMtdBsNTs3GqF3VnA+IPAEvYh7E/7lZqdCF5A9PBE6NoMfR2pYwQGECgYEA8x+uTJzio+cRYBYImBtb1EgNdn2PQZZoWI7sN/S13EUSh6+hO9Tud8SiEKHdgcgjcFNmK1AFOwLLd+tHc+gZlE2rBQ1M98QTm6/urVKyLGDpLroLpuA6jQFQYVBl/xTXT6sDeZzQ7cSLwjw4gLfWtCkNsTEMXTPEUa8Vd8DY0Z8CgYEA6uHzmQJNw/5RB1Vfu2iQ7u7WqG8EXYoGqs+4wGDx1s24VVF3/6/PZ2RsatJk7+YgRI45OmrLgqf8dna3/YpyWK/3rje8i0UOorUBLxIlYL1l2xZzIQzoY/x8UjO2fhYkYer5sOyITcd/bX++LS9T+LKms82oPmNjMkLKJDvAWZsCgYEA2kD5httb9kmL5pdBFdORp0sbkuB6xyVP/Rgo5L6wt9HmJZq8AmtPvILv/kBhCo3xinfEA2PtniEPKVM0rM+Sjvj+ayWaj94cwCm6+SuAuagyDPmFVkR7K3QfhYzYU5qRA3sBPp5RTPGhiTfofV0LyGYGXagrckvzlGS5v+yGd/8CgYADGo0/flpMtrWXZTdooI8ZuSo4+46RNdu0sh383MsVTY6cAgGV7VrOQPN1zeXrjZzriv2SmgqqZVHett7jiMrOBTU+phnltTnmSIIFfzXjO113Maq/yw3fFF0IMQq+S8ibSqGWBuoeLP6wEboPmsp/RM0THyqT+Hg9F8jYBboa9QKBgE7SYE81mQLES1sIIEe4dqKm5rfUVgIFqMHSHbs3ehUxQbX04LcHXFHucl2FztByNj68cUCU0r3GuttesYqDXeMAaFOW0WmgZ1JUd5PxrkGjcvOs/G4RoAeZTLFMdTIHRydmtvhqXvr4EsIN6GuEBCEXsGp41FS9PRfbhY3iFZOM";
// 支付宝的公钥,
public static String ali_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmawKcguB5uPdeNVaLemm8NUA3pvPlioYaiepgZrVuDMQMwr6Z7tGRkf8fUfG1dTn+TFB5TLPJ4k5cHIinIHtI95YKEng6T379tVjXXme8Y8sQl7KwZMuKcD3Olbnsxef6XDS2O0rgXAK/w5jOxXUYNCIkKRaRQi0Q2vy5re2rWnc11AOrxMol9GakTPltI/ie6/ePI+euT5KJxHFywCTkO0BaUFyCUCdwj2kSs2Zr53e5mqYltDTvF8KlcZxmb1YiTQGLoi5TqBX+lRN11TbIg+apy2naShouV7P0YnEcGa/1sU3ZDSiGUdOUi2z0lRXniNpAxIn8fU+P+SvkhRxOwIDAQAB";
// 接收通知的接口名(这里的域名或者ip需要填写外网可以访问的地址)
public static String service = "https://www.dq-city.com/aliPay/api/callBack";
//APPID
public static String app_id="2018082761115636";
}
ApplyController:
model是需要自己传入的参数
package com.cn.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.cn.config.AlipayConfig;
import com.cn.utils.OrderNumber;
import com.cn.utils.ResultBean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: gxp
* @Date: 2018/8/20 11:02
* @Description 获取客户端订单信息,返回签名后的订单信息
*/
@Controller
public class ApplyController {
@RequestMapping(value = "/api/apply")
@ResponseBody
public ResultBean apply(@RequestParam String money) {
System.out.println("===========================支付宝调用开始");
//实例化客户端
String mess = "";
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", AlipayConfig.app_id,
AlipayConfig.private_key, "json", "UTF-8", AlipayConfig.ali_public_key, "RSA2"); //固定值
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); //model是要定义的值
model.setBody("全息通服务平台");
model.setSubject("全息通服务平台");
model.setOutTradeNo(OrderNumber.getOrderIdByTime());
System.out.println("订单号为:"+OrderNumber.getOrderIdByTime());
model.setTimeoutExpress("30m");
model.setTotalAmount(money);
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.service);
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println("orderString:"+response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
mess = response.getBody();
Map<String,Object> map = new HashMap();
map.put("orderString",mess);
return ResultBean.ok(map);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return ResultBean.error();
}
}
============
工程中进行了适当的修改:
AlipayUtil:
package com.air.order.service.orderUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.air.order.service.service.impl.OrderServiceImpl;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
public class AlipayUtil {
protected static Logger logger=LoggerFactory.getLogger(AlipayUtil.class);
//支付宝网站支付
public static String APPID = "2018090561276453";
public static String RSA_PRIVATE_KEY ="MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDaRfK+hd6jGBgHhthWf1RzSeLfK4EaOP90AwD4Tuw8zlmJAYph3qGQ9C7nHq/mh58O9H/cssSBiyO87vmrRJTbv6tObsfQ0J8GDUINmUGASp8x0pfoYA2b13YIv+sd8ZX12wHFrvbn7fSDaoGyOYhA/tZpA8eYA5y08eTAFGJ/S74pJX0lqrlvCHjOzstmerSLWHP0UDrKNcYcmiGnWs3O2p6mz0lpEz2u2YAPpiToe+56JcSnk5qSzlwQwjWL4PhKsmgQz542eRJhCZmuymsqDc1i1jlp/E0BqlZf0/lxcuA++9pVuFPZa2CHaq3TLSrAMliWS3wpH7FlByeg8qWJAgMBAAECggEAOsfVjEte3osRhY1h20FlC7sdFr6PgPFSkfpxG22dnu5vHD9G9f5PgkrQCruv4SQqyIs9l8CovL4svKeaou3QLLGcP34D348fFDEj1aetBRCTeIZfFFwxrgNDLS4J8kFqAhCdlI/+vAzP6UgYb1ehAufd89/ps11dqTjvQm76646Jqrg6IktjXnrFc9YEOL6znTCRyAfd3T6UC/SefYOseS9BSPxO46T8YFTREtl+Rhi7sOcFSk0lTDJ9mgheFdXfP0X8mYTZspIryJFoklctRo3glqInZdTPckqA2oT7EOwuMvxBVdd+t34p17LZrDC7KQ+3IA2nlBaVw4roLBk2BQKBgQD8a/bu4xo/tbbYOH9B82tpbdLPgt2gTUYkH1aLf5D1qFieheQf4fxvFvF8E6t8CRj82B6bGkScZO8X8C5NMAXnKD8xyGNfnZxSJGbgYGSJM4l7Xt6A+d/Rhcd7/YqwpccawTsieYklD7v+2dtAqafIyLOxHH5guJ8ZSl2KipqO2wKBgQDdXg8jzLtqVgAnPlDttkNJ9NyWD1cpUV70eM79AkpcBKC+k6FvTDq07edxqXdQf8iRyegW86oem4iWNDBmse3v1C1i78pSPtEVbc4XjKDdqKp7LGlaTNxlGeP/Mo1vaNRxIJg62p7G1IWo/KV3/zQxVZORW+Fj/1/5ciIGPAXQawKBgDMCrnhANMHDOxwe7ripNH+tzfhZfegzNYV/P8IZGXZLev0uGZfH13err0lfwDvkqsQN+MFnYY4pZ5fy1aiLl+XK4FpzIIHmG/0Nliypzidb3uCrn1N5K53v5wxLhIeGOOJTQlwJK4nt0BQEeqZqopmU1ZtpIrDxHlXCDX093VYZAoGAYhfZG6MQdZlwbfNmR0AZ5z7TNMfNduiw7CJQjrsiGk6OsISY58nexegaRDq1PX2ycjAHYYxOGUwQpYaw4AD+j+T0y7+4ZuOhIR7MUZEmg7LHANf4Q2SF0WM8rgxHslPAt/SaoJHaA/+OzwhNhrQW+7mRL7uIUBiM/et+ekbEyMsCgYAEAp8VTXX23gvn2ZJ32xrnHPdmKUPFSSjq85/NWqwWlA1YQL+mupVVSMzFOjzMJM8G8d/qsY6iVC15JD3qNUFR9RP9UwQawbq+yPgV4nziGbgnE9y8k/lsCL8Jq03791dcH8WC40ikzoZT5vvyDPcLX/23ZBFcaS1spgFx7bOe/w==";
public static String return_url = "http://www.hiss.com.cn/zplatform-web/web/phone/buy_success.html";
public static String URL = "https://openapi.alipay.com/gateway.do";
public static String CHARSET = "UTF-8";
public static String FORMAT = "json";
public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2kXyvoXeoxgYB4bYVn9Uc0ni3yuBGjj/dAMA+E7sPM5ZiQGKYd6hkPQu5x6v5oefDvR/3LLEgYsjvO75q0SU27+rTm7H0NCfBg1CDZlBgEqfMdKX6GANm9d2CL/rHfGV9dsBxa725+30g2qBsjmIQP7WaQPHmAOctPHkwBRif0u+KSV9Jaq5bwh4zs7LZnq0i1hz9FA6yjXGHJohp1rNztqeps9JaRM9rtmAD6Yk6HvueiXEp5Oaks5cEMI1i+D4SrJoEM+eNnkSYQmZrsprKg3NYtY5afxNAapWX9P5cXLgPvvaVbhT2Wtgh2qt0y0qwDJYlkt8KR+xZQcnoPKliQIDAQAB";
public static String SIGNTYPE = "RSA2";
public static String pay_ALI_WEB(String out_trade_no,double total_amount,String subject,String notify_url) throws Exception{
AlipayClient client = new DefaultAlipayClient(URL, APPID, RSA_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY,SIGNTYPE);
AlipayTradeAppPayRequest alipay_request=new AlipayTradeAppPayRequest();
// 封装请求支付信息
AlipayTradeAppPayModel model=new AlipayTradeAppPayModel();
model.setOutTradeNo(out_trade_no);
model.setSubject(subject);
model.setTotalAmount(String.valueOf(total_amount));
model.setProductCode("QUICK_MSECURITY_PAY");
alipay_request.setBizModel(model);
// 设置异步通知地址
alipay_request.setNotifyUrl(notify_url);
try {
// 调用SDK生成表单
//form = client.pageExecute(alipay_request).getBody();
// AlipayTradeAppPayResponse response = client.pageExecute(alipay_request);
AlipayTradeAppPayResponse response = client.sdkExecute(alipay_request);
logger.info(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
if(response.isSuccess()){
logger.info("调用成功");
return response.getBody();
} else {
logger.info("调用失败");
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 需要
* 1 订单号 out_trade_no 1201809122032014087
* 2 refund_amount
* @return
* @throws Exception
*/
public static String refundALiPay(String out_trade_no,double refund_amount,String refund_reason ) throws Exception{
AlipayClient alipayClient = new DefaultAlipayClient(URL, APPID, RSA_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY,SIGNTYPE);
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
AlipayRefund alipayRefund= new AlipayRefund();
alipayRefund.setOut_trade_no("1201809141026343532");//这个是商户的订单号
alipayRefund.setTrade_no("2018091422001471850546837535");//这个是支付宝的订单号
alipayRefund.setRefund_amount("0.01");//退款金额
alipayRefund.setRefund_reason("正常退款");//退款说明
alipayRefund.setOut_request_no("HZ01RF001");
alipayRefund.setOperator_id("OP001");
alipayRefund.setStore_id("NJ_S_001");
alipayRefund.setTerminal_id("NJ_T_001");//request.setBizContent(JSONUtil.simpleObjectToJsonStr(alipayRefund));
request.setBizContent(JSONObject.toJSONString(alipayRefund));//2个都可以,这个参数的顺序 不影响退款
AlipayTradeRefundResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return null;
}
public static void main(String[] args) {
try {
refundALiPay("1201809122032014087", 10.0, "你好");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
将生成订单的代码和配置的代码写在了一起,然后调用util中的pay_ALI_WEB方法生成订单
String aliPay = AlipayUtil.pay_ALI_WEB(orderId, order.getTotalFee()/100.00, body, param.getPaymentURL()+"ByaliPay");
AlipayVo aliPayVo = new AlipayVo();
aliPayVo.setAlipay(aliPay);
aliPayVo.setNonceStr(NONCE_STR_WX);
logger.info(aliPay+"支付宝的重要内容");
logger.info(NONCE_STR_WX+"随机字符串");
result.setDataArray(aliPayVo);
return result;