增加支付宝微信支付案例

This commit is contained in:
egzosn
2018-01-26 19:44:03 +08:00
parent b6c714f33e
commit 497699dece
4 changed files with 541 additions and 17 deletions

View File

@@ -0,0 +1,258 @@
package com.egzosn.pay.demo.controller;
import com.egzosn.pay.ali.api.AliPayConfigStorage;
import com.egzosn.pay.ali.api.AliPayService;
import com.egzosn.pay.ali.bean.AliTransactionType;
import com.egzosn.pay.common.api.Callback;
import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.*;
import com.egzosn.pay.common.http.UriVariables;
import com.egzosn.pay.common.util.MatrixToImageWriter;
import com.egzosn.pay.common.util.sign.SignUtils;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.demo.entity.ApyAccount;
import com.egzosn.pay.demo.entity.PayType;
import com.egzosn.pay.demo.request.QueryOrder;
import com.egzosn.pay.demo.service.ApyAccountService;
import com.egzosn.pay.demo.service.PayResponse;
import com.egzosn.pay.payoneer.api.PayoneerPayService;
import com.egzosn.pay.wx.bean.WxTransactionType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
import static com.egzosn.pay.demo.dao.ApyAccountRepository.apyAccounts;
/**
* 发起支付入口
*
* @author: egan
* @email egzosn@gmail.com
* @date 2016/11/18 0:25
*/
@RestController
@RequestMapping("ali")
public class AliPayController {
private PayService service = null;
@PostConstruct
public void init() {
AliPayConfigStorage aliPayConfigStorage = new AliPayConfigStorage();
aliPayConfigStorage.setPid("2088102169916436");
aliPayConfigStorage.setAppId("2016080400165436");
aliPayConfigStorage.setKeyPublic("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB");
aliPayConfigStorage.setKeyPrivate("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKroe/8h5vC4L6T+B2WdXiVwGsMvUKgb2XsKix6VY3m2wcf6tyzpNRDCNykbIwGtaeo7FshN+qZxdXHLiIam9goYncBit/8ojfLGy2gLxO/PXfzGxYGs0KsDZ+ryVPPmE34ZZ8jiJpR0ygzCFl8pN3QJPJRGTJn5+FTT9EF/9zyZAgMBAAECgYAktngcYC35u7cQXDk+jMVyiVhWYU2ULxdSpPspgLGzrZyG1saOcTIi/XVX8Spd6+B6nmLQeF/FbU3rOeuD8U2clzul2Z2YMbJ0FYay9oVZFfp5gTEFpFRTVfzqUaZQBIjJe/xHL9kQVqc5xHlE/LVA27/Kx3dbC35Y7B4EVBDYAQJBAOhsX8ZreWLKPhXiXHTyLmNKhOHJc+0tFH7Ktise/0rNspojU7o9prOatKpNylp9v6kux7migcMRdVUWWiVe+4ECQQC8PqsuEz7B0yqirQchRg1DbHjh64bw9Kj82EN1/NzOUd53tP9tg+SO97EzsibK1F7tOcuwqsa7n2aY48mQ+y0ZAkBndA2xcRcnvOOjtAz5VO8G7R12rse181HjGfG6AeMadbKg30aeaGCyIxN1loiSfNR5xsPJwibGIBg81mUrqzqBAkB+K6rkaPXJR9XtzvdWb/N3235yPkDlw7Z4MiOVM3RzvR/VMDV7m8lXoeDde2zQyeMOMYy6ztwA6WgE1bhGOnQRAkEAouUBv1sVdSBlsexX15qphOmAevzYrpufKgJIRLFWQxroXMS7FTesj+f+FmGrpPCxIde1dqJ8lqYLTyJmbzMPYw==");
aliPayConfigStorage.setNotifyUrl("http://pay.egzosn.com/payBack.json");
aliPayConfigStorage.setReturnUrl("http://pay.egzosn.com/payBack.html");
aliPayConfigStorage.setSignType(SignUtils.RSA.name());
aliPayConfigStorage.setSeller("2088102169916436");
aliPayConfigStorage.setInputCharset("utf-8");
//是否为测试账号,沙箱环境
aliPayConfigStorage.setTest(true);
service = new AliPayService(aliPayConfigStorage);
}
/**
* 跳到支付页面
* 针对实时支付,即时付款
*
* @param price 金额
* @return 跳到支付页面
*/
@RequestMapping(value = "toPay.html", produces = "text/html;charset=UTF-8")
public String toPay( BigDecimal price) {
//及时收款
PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), AliTransactionType.DIRECT);
//WAP
// PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), AliTransactionType.WAP);
Map orderInfo = service.orderInfo(order);
return service.buildRequest(orderInfo, MethodType.POST);
}
/**
* 获取支付预订单信息
*
* @return 支付预订单信息
*/
@RequestMapping("app")
public Map<String, Object> app() {
Map<String, Object> data = new HashMap<>();
data.put("code", 0);
PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01), UUID.randomUUID().toString().replace("-", ""));
//App支付
order.setTransactionType(AliTransactionType.APP);
data.put("orderInfo", UriVariables.getMapToParameters(service.orderInfo(order)));
return data;
}
/**
* 获取二维码图像
* 二维码支付
* @param price 金额
* @return 二维码图像
*/
@RequestMapping(value = "toQrPay.jpg", produces = "image/jpeg;charset=UTF-8")
public byte[] toWxQrPay( BigDecimal price) throws IOException {
//获取对应的支付账户操作工具可根据账户id
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(service.genQrPay( new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, System.currentTimeMillis()+"", AliTransactionType.SWEEPPAY)), "JPEG", baos);
return baos.toByteArray();
}
/**
* 刷卡付,pos主动扫码付款(条码付)
* @param authCode 授权码,条码等
* @param price 金额
* @return 支付结果
*/
@RequestMapping(value = "microPay")
public Map<String, Object> microPay(BigDecimal price, String authCode) throws IOException {
//获取对应的支付账户操作工具可根据账户id
//条码付
PayOrder order = new PayOrder("huodull order", "huodull order", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), AliTransactionType.BAR_CODE);
//声波付
// PayOrder order = new PayOrder("huodull order", "huodull order", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), AliTransactionType.WAVE_CODE);
//设置授权码,条码等
order.setAuthCode(authCode);
//支付结果
Map<String, Object> params = service.microPay(order);
//校验
if (service.verify(params)) {
//支付校验通过后的处理
//......业务逻辑处理块........
}
//这里开发者自行处理
return params;
}
/**
* 支付回调地址
*
* @param request
*
* @return
*/
@RequestMapping(value = "payBack.json")
public String payBack(HttpServletRequest request) throws IOException {
//获取支付方返回的对应参数
Map<String, Object> params = service.getParameter2Map(request.getParameterMap(), request.getInputStream());
if (null == params) {
return service.getPayOutMessage("fail", "失败").toMessage();
}
//校验
if (service.verify(params)) {
//这里处理业务逻辑
//......业务逻辑处理块........
return service.getPayOutMessage("success", "成功").toMessage();
}
return service.getPayOutMessage("fail", "失败").toMessage();
}
/**
* 查询
*
* @param order 订单的请求体
* @return 返回查询回来的结果集,支付方原值返回
*/
@RequestMapping("query")
public Map<String, Object> query(QueryOrder order) {
return service.query(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 交易关闭接口
*
* @param order 订单的请求体
* @return 返回支付方交易关闭后的结果
*/
@RequestMapping("close")
public Map<String, Object> close(QueryOrder order) {
return service.close(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 申请退款接口
*
* @param order 订单的请求体
* @return 返回支付方申请退款后的结果
*/
@RequestMapping("refund")
public Map<String, Object> refund(RefundOrder order) {
return service.refund(order);
}
/**
* 查询退款
*
* @param order 订单的请求体
* @return 返回支付方查询退款后的结果
*/
@RequestMapping("refundquery")
public Map<String, Object> refundquery(QueryOrder order) {
return service.refundquery(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 下载对账单
*
* @param order 订单的请求体
* @return 返回支付方下载对账单的结果
*/
@RequestMapping("downloadbill")
public Object downloadbill(QueryOrder order) {
return service.downloadbill(order.getBillDate(), order.getBillType());
}
/**
* 通用查询接口,根据 AliTransactionType 类型进行实现,此接口不包括退款
*
* @param order 订单的请求体
* @return 返回支付方对应接口的结果
*/
@RequestMapping("secondaryInterface")
public Map<String, Object> secondaryInterface(QueryOrder order) {
TransactionType type = AliTransactionType.valueOf(order.getTransactionType());
return service.secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
}
});
}
}

View File

@@ -56,32 +56,18 @@ public class PayController {
* 获取授权页面
* @param payId
* @param payeeId
* @param authPageType
* @return
*/
@RequestMapping("getAuthorizationPage.json")
public Map<String ,Object> getAuthorizationPage(Integer payId,String payeeId,AuthPageType authPageType ){
public Map<String ,Object> getAuthorizationPage(Integer payId,String payeeId ){
PayResponse payResponse = service.getPayResponse(payId);
PayoneerPayService payoneerPayService = (PayoneerPayService) payResponse.getService();
Map<String, Object> data = new LinkedHashMap<>();
data.put("code", 0);
data.put("url", payoneerPayService.getAuthorizationPage(payeeId,authPageType));
data.put("url", payoneerPayService.getAuthorizationPage(payeeId));
return data;
}
/**
* 发起收款申请
* @param payId 账户id
* @param payeeId 授权id(收款id)
* @param payOrder 订单信息
* @return 收款请求结果
*/
@RequestMapping("charges")
public Map<String ,Object> charges(Integer payId,String payeeId,PayOrder payOrder){
PayResponse payResponse = service.getPayResponse(payId);
PayoneerPayService service = (PayoneerPayService) payResponse.getService();
return service.charges(payeeId,payOrder);
}
/**
@@ -194,7 +180,7 @@ public class PayController {
//获取对应的支付账户操作工具可根据账户id
PayResponse payResponse = service.getPayResponse(payId);
PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType));
PayOrder order = new PayOrder("huodull order", "huodull order", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType));
//设置授权码,条码等
order.setAuthCode(authCode);
//支付结果

View File

@@ -0,0 +1,265 @@
package com.egzosn.pay.demo.controller;
import com.egzosn.pay.common.api.Callback;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.UriVariables;
import com.egzosn.pay.demo.entity.PayType;
import com.egzosn.pay.demo.request.QueryOrder;
import com.egzosn.pay.demo.service.PayResponse;
import com.egzosn.pay.wx.api.WxPayConfigStorage;
import com.egzosn.pay.wx.api.WxPayService;
import com.egzosn.pay.wx.bean.WxTransactionType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 发起支付入口
*
* @author: egan
* @email egzosn@gmail.com
* @date 2016/11/18 0:25
*/
@RestController
@RequestMapping("wx")
public class WxPayController {
private PayService service = null;
@PostConstruct
public void init() {
WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage();
wxPayConfigStorage.setMchId("合作者id商户号");
wxPayConfigStorage.setAppid("应用id");
wxPayConfigStorage.setKeyPublic("密钥");
wxPayConfigStorage.setKeyPrivate("密钥");
wxPayConfigStorage.setNotifyUrl("异步回调地址");
wxPayConfigStorage.setReturnUrl("同步回调地址");
wxPayConfigStorage.setSignType("签名方式");
wxPayConfigStorage.setInputCharset("utf-8");
service = new WxPayService(wxPayConfigStorage);
}
/**
* 跳到支付页面
* 针对实时支付
*
* @param price 金额
* @return 跳到支付页面
*/
@RequestMapping(value = "toPay.html", produces = "text/html;charset=UTF-8")
public String toPay( HttpServletRequest request, BigDecimal price) {
PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price , UUID.randomUUID().toString().replace("-", ""), WxTransactionType.MWEB);
order.setSpbillCreateIp(request.getHeader("X-Real-IP"));
StringBuffer requestURL = request.getRequestURL();
//设置网页地址
order.setWapUrl(requestURL.substring(0, requestURL.indexOf("/") > 0 ? requestURL.indexOf("/") : requestURL.length() ));
//设置网页名称
order.setWapName("在线充值");
Map orderInfo = service.orderInfo(order);
return service.buildRequest(orderInfo, MethodType.POST);
}
/**
* 公众号支付
*
*
* @param openid openid
* @param price 金额
* @return 返回jsapi所需参数
*/
@RequestMapping(value = "jsapi" )
public Map toPay(String openid, BigDecimal price) {
PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), WxTransactionType.JSAPI);
order.setOpenid(openid);
Map orderInfo = service.orderInfo(order);
orderInfo.put("code", 0);
return orderInfo;
}
/**
* 获取支付预订单信息
*
* @return 支付预订单信息
*/
@RequestMapping("app")
public Map<String, Object> app() {
Map<String, Object> data = new HashMap<>();
data.put("code", 0);
PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01), UUID.randomUUID().toString().replace("-", ""));
//App支付
order.setTransactionType(WxTransactionType.APP);
data.put("orderInfo", service.orderInfo(order));
return data;
}
/**
* 获取二维码图像
* 二维码支付
* @param price 金额
* @return 二维码图像
*/
@RequestMapping(value = "toQrPay.jpg", produces = "image/jpeg;charset=UTF-8")
public byte[] toWxQrPay( BigDecimal price) throws IOException {
//获取对应的支付账户操作工具可根据账户id
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(service.genQrPay( new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, System.currentTimeMillis()+"", WxTransactionType.NATIVE)), "JPEG", baos);
return baos.toByteArray();
}
/**
* 刷卡付,pos主动扫码付款(条码付)
* @param authCode 授权码,条码等
* @param price 金额
* @return 支付结果
*/
@RequestMapping(value = "microPay")
public Map<String, Object> microPay( BigDecimal price, String authCode) throws IOException {
//获取对应的支付账户操作工具可根据账户id
//条码付
PayOrder order = new PayOrder("huodull order", "huodull order", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), WxTransactionType.MICROPAY);
//设置授权码,条码等
order.setAuthCode(authCode);
//支付结果
Map<String, Object> params = service.microPay(order);
//校验
if (service.verify(params)) {
//支付校验通过后的处理
//......业务逻辑处理块........
}
//这里开发者自行处理
return params;
}
/**
* 支付回调地址
*
* @param request
*
* @return
*/
@RequestMapping(value = "payBack.json")
public String payBack(HttpServletRequest request) throws IOException {
//获取支付方返回的对应参数
Map<String, Object> params = service.getParameter2Map(request.getParameterMap(), request.getInputStream());
if (null == params) {
return service.getPayOutMessage("fail", "失败").toMessage();
}
//校验
if (service.verify(params)) {
//这里处理业务逻辑
//......业务逻辑处理块........
return service.getPayOutMessage("success", "成功").toMessage();
}
return service.getPayOutMessage("fail", "失败").toMessage();
}
/**
* 查询
*
* @param order 订单的请求体
* @return 返回查询回来的结果集,支付方原值返回
*/
@RequestMapping("query")
public Map<String, Object> query(QueryOrder order) {
return service.query(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 交易关闭接口
*
* @param order 订单的请求体
* @return 返回支付方交易关闭后的结果
*/
@RequestMapping("close")
public Map<String, Object> close(QueryOrder order) {
return service.close(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 申请退款接口
*
* @param order 订单的请求体
* @return 返回支付方申请退款后的结果
*/
@RequestMapping("refund")
public Map<String, Object> refund(RefundOrder order) {
return service.refund(order);
}
/**
* 查询退款
*
* @param order 订单的请求体
* @return 返回支付方查询退款后的结果
*/
@RequestMapping("refundquery")
public Map<String, Object> refundquery(QueryOrder order) {
return service.refundquery(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 下载对账单
*
* @param order 订单的请求体
* @return 返回支付方下载对账单的结果
*/
@RequestMapping("downloadbill")
public Object downloadbill(QueryOrder order) {
return service.downloadbill(order.getBillDate(), order.getBillType());
}
/**
* 通用查询接口,根据 WxTransactionType 类型进行实现,此接口不包括退款
*
* @param order 订单的请求体
* @return 返回支付方对应接口的结果
*/
@RequestMapping("secondaryInterface")
public Map<String, Object> secondaryInterface(QueryOrder order) {
TransactionType type = WxTransactionType.valueOf(order.getTransactionType());
return service.secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
}
});
}
}

View File

@@ -116,6 +116,21 @@ getOrderInfo" target="_blank">
<button id="js_submit">提交</button>
<br>
主动收款(pos条码声波付等)
<form action="microPay" target="_blank">
账户id<input type="text" name="payId">
<br>
金额<input type="text" name="price">
<br>
交易类型<input type="text" name="transactionType">
<br>
条码授权信息<input type="text" name="authCode">
<br>
<input type="submit" value="提交">
</form>
<br>
<br>
二维码
<form action="toQrPay.jpg" target="_blank">