"src/main/webapp/templets/1/default/images/03.jpg" did not exist on "c9bf4f7e66b8fafcfe4ad7ff795c691daab54f8b"
Commit d53783a9 authored by jmdhappy's avatar jmdhappy
Browse files

初始化提交

parent 324ccaaf
package org.xxpay.web.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.xxpay.common.constant.PayConstant;
import org.xxpay.common.util.MyLog;
import org.xxpay.common.util.MySeq;
import org.xxpay.common.util.PayDigestUtil;
import org.xxpay.common.util.XXPayUtil;
import org.xxpay.web.service.MchInfoServiceClient;
import org.xxpay.web.service.PayChannelServiceClient;
import org.xxpay.web.service.PayOrderServiceClient;
import java.util.Map;
/**
* @Description: 支付订单,包括:统一下单,订单查询,补单等接口
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@RestController
public class PayOrderController {
private final MyLog _log = MyLog.getLog(PayOrderController.class);
@Autowired
private DiscoveryClient client;
@Autowired
private PayOrderServiceClient payOrderServiceClient;
@Autowired
private MchInfoServiceClient mchInfoServiceClient;
@Autowired
private PayChannelServiceClient payChannelServiceClient;
/**
* 统一下单接口:
* 1)先验证接口参数以及签名信息
* 2)验证通过创建支付订单
* 3)根据商户选择渠道,调用支付服务进行下单
* 4)返回下单数据
* @param params
* @return
*/
@RequestMapping(value = "/pay/create_order", method = RequestMethod.POST)
public String payOrder(@RequestParam String params) {
ServiceInstance instance = client.getLocalServiceInstance();
_log.info("###### 开始接收商户统一下单请求 ######");
_log.info("/pay_order, host:" + instance.getHost() + ", service_id:" + instance.getServiceId() + ", params:" + params);
JSONObject po = JSONObject.parseObject(params);
JSONObject payOrder = null;
try {
// 验证参数有效性
Object object = validateParams(po);
if (object instanceof String) {
// 参数错误
_log.info("请求参数错误:{}", object);
return XXPayUtil.makeRetFail(XXPayUtil.makeRetMap(PayConstant.RETURN_VALUE_FAIL, object.toString(), null, null));
}
if (object instanceof JSONObject) payOrder = (JSONObject) object;
if(payOrder == null) return XXPayUtil.makeRetFail(XXPayUtil.makeRetMap(PayConstant.RETURN_VALUE_FAIL, "支付中心下单失败", null, null));
String result = payOrderServiceClient.createPayOrder(payOrder.toJSONString());
_log.info("插入支付订单数据,结果:{}", result);
String channelId = payOrder.getString("channelId");
switch (channelId) {
case PayConstant.PAY_CHANNEL_WX_APP :
return payOrderServiceClient.doWxPayReq(getJsonParam(new String[]{"tradeType", "payOrder"}, new Object[]{PayConstant.WxConstant.TRADE_TYPE_APP, payOrder}));
case PayConstant.PAY_CHANNEL_WX_JSAPI :
return payOrderServiceClient.doWxPayReq(getJsonParam(new String[]{"tradeType", "payOrder"}, new Object[]{PayConstant.WxConstant.TRADE_TYPE_JSPAI, payOrder}));
case PayConstant.PAY_CHANNEL_WX_NATIVE :
return payOrderServiceClient.doWxPayReq(getJsonParam(new String[]{"tradeType", "payOrder"}, new Object[]{PayConstant.WxConstant.TRADE_TYPE_NATIVE, payOrder}));
case PayConstant.PAY_CHANNEL_ALIPAY_MOBILE :
return payOrderServiceClient.doAliPayMobileReq(getJsonParam("payOrder", payOrder));
case PayConstant.PAY_CHANNEL_ALIPAY_PC :
return payOrderServiceClient.doAliPayPcReq(getJsonParam("payOrder", payOrder));
case PayConstant.PAY_CHANNEL_ALIPAY_WAP :
return payOrderServiceClient.doAliPayWapReq(getJsonParam("payOrder", payOrder));
default:
break;
}
}catch (Exception e) {
_log.error(e, "");
return XXPayUtil.makeRetFail(XXPayUtil.makeRetMap(PayConstant.RETURN_VALUE_FAIL, "支付中心系统异常", null, null));
}
return null;
}
/**
* 验证创建订单请求参数,参数通过返回JSONObject对象,否则返回错误文本信息
* @param params
* @return
*/
private Object validateParams(JSONObject params) {
// 验证请求参数,参数有问题返回错误提示
String errorMessage;
// 支付参数
String mchId = params.getString("mchId"); // 商户ID
String mchOrderNo = params.getString("mchOrderNo"); // 商户订单号
String channelId = params.getString("channelId"); // 渠道ID
String amount = params.getString("amount"); // 支付金额(单位分)
String currency = params.getString("currency"); // 币种
String clientIp = params.getString("clientIp"); // 客户端IP
String device = params.getString("device"); // 设备
String extra = params.getString("extra"); // 特定渠道发起时额外参数
String param1 = params.getString("param1"); // 扩展参数1
String param2 = params.getString("param2"); // 扩展参数2
String notifyUrl = params.getString("notifyUrl"); // 支付结果回调URL
String sign = params.getString("sign"); // 签名
String subject = params.getString("subject"); // 商品主题
String body = params.getString("body"); // 商品描述信息
// 验证请求参数有效性(必选项)
if(StringUtils.isBlank(mchId)) {
errorMessage = "request params[mchId] error.";
return errorMessage;
}
if(StringUtils.isBlank(mchOrderNo)) {
errorMessage = "request params[mchOrderNo] error.";
return errorMessage;
}
if(StringUtils.isBlank(channelId)) {
errorMessage = "request params[channelId] error.";
return errorMessage;
}
if(!NumberUtils.isNumber(amount)) {
errorMessage = "request params[amount] error.";
return errorMessage;
}
if(StringUtils.isBlank(currency)) {
errorMessage = "request params[currency] error.";
return errorMessage;
}
if(StringUtils.isBlank(notifyUrl)) {
errorMessage = "request params[notifyUrl] error.";
return errorMessage;
}
if(StringUtils.isBlank(subject)) {
errorMessage = "request params[subject] error.";
return errorMessage;
}
if(StringUtils.isBlank(body)) {
errorMessage = "request params[body] error.";
return errorMessage;
}
// 根据不同渠道,判断extra参数
if(PayConstant.PAY_CHANNEL_WX_JSAPI.equalsIgnoreCase(channelId)) {
if(StringUtils.isEmpty(extra)) {
errorMessage = "request params[extra] error.";
return errorMessage;
}
JSONObject extraObject = JSON.parseObject(extra);
String openId = extraObject.getString("openId");
if(StringUtils.isBlank(openId)) {
errorMessage = "request params[extra.openId] error.";
return errorMessage;
}
}else if(PayConstant.PAY_CHANNEL_WX_NATIVE.equalsIgnoreCase(channelId)) {
if(StringUtils.isEmpty(extra)) {
errorMessage = "request params[extra] error.";
return errorMessage;
}
JSONObject extraObject = JSON.parseObject(extra);
String productId = extraObject.getString("productId");
if(StringUtils.isBlank(productId)) {
errorMessage = "request params[extra.productId] error.";
return errorMessage;
}
}
// 签名信息
if (StringUtils.isEmpty(sign)) {
errorMessage = "request params[sign] error.";
return errorMessage;
}
// 查询商户信息
String retStr = mchInfoServiceClient.selectMchInfo(getJsonParam("mchId", mchId));
JSONObject retObj = JSON.parseObject(retStr);
JSONObject mchInfo = retObj.getJSONObject("result");
if (mchInfo == null) {
errorMessage = "Can't found mchInfo[mchId="+mchId+"] record in db.";
return errorMessage;
}
if(mchInfo.getByte("state") != 1) {
errorMessage = "mchInfo not available [mchId="+mchId+"] record in db.";
return errorMessage;
}
String reqKey = mchInfo.getString("reqKey");
if (StringUtils.isBlank(reqKey)) {
errorMessage = "reqKey is null[mchId="+mchId+"] record in db.";
return errorMessage;
}
// 查询商户对应的支付渠道
retStr = payChannelServiceClient.selectPayChannel(getJsonParam(new String[]{"channelId", "mchId"}, new String[]{channelId, mchId}));
retObj = JSON.parseObject(retStr);
JSONObject payChannel = retObj.getJSONObject("result");
if(payChannel == null) {
errorMessage = "Can't found payChannel[channelId="+channelId+",mchId="+mchId+"] record in db.";
return errorMessage;
}
if(payChannel.getByte("state") != 1) {
errorMessage = "channel not available [channelId="+channelId+",mchId="+mchId+"]";
return errorMessage;
}
// 验证签名数据
boolean verifyFlag = XXPayUtil.verifyPaySign(params, reqKey);
if(!verifyFlag) {
errorMessage = "Verify XX pay sign failed.";
return errorMessage;
}
// 验证参数通过,返回JSONObject对象
JSONObject payOrder = new JSONObject();
payOrder.put("payOrderId", MySeq.getPay());
payOrder.put("mchId", mchId);
payOrder.put("mchOrderNo", mchOrderNo);
payOrder.put("channelId", channelId);
payOrder.put("amount", Long.parseLong(amount));
payOrder.put("currency", currency);
payOrder.put("clientIp", clientIp);
payOrder.put("device", device);
payOrder.put("subject", subject);
payOrder.put("body", body);
payOrder.put("extra", extra);
payOrder.put("channelMchId", payChannel.getString("channelMchId"));
payOrder.put("param1", param1);
payOrder.put("param2", param2);
payOrder.put("notifyUrl", notifyUrl);
return payOrder;
}
/*String makeRetData(Map retMap) {
if(retMap.get(PayConstant.RETURN_PARAM_RETCODE).equals(PayConstant.RETURN_VALUE_SUCCESS)) {
String repKey = "Hpcl522AV6q613KIi46u6g6XuW8vM1N8bFgyv769770MdYe9u37M4y7rIpl8";
String sign = PayDigestUtil.getSign(retMap, repKey, "payParams");
retMap.put(PayConstant.RESULT_PARAM_SIGN, sign);
}
_log.info("生成响应数据:{}", retMap);
return JSON.toJSONString(retMap);
}*/
String getJsonParam(String[] names, Object[] values) {
JSONObject jsonParam = new JSONObject();
for (int i = 0; i < names.length; i++) {
jsonParam.put(names[i], values[i]);
}
return jsonParam.toJSONString();
}
String getJsonParam(String name, Object value) {
JSONObject jsonParam = new JSONObject();
jsonParam.put(name, value);
return jsonParam.toJSONString();
}
}
package org.xxpay.web.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.xxpay.common.util.MyBase64;
/**
* @Description:
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@Service
public class MchInfoServiceClient {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "selectMchInfoFallback")
public String selectMchInfo(String jsonParam) {
return restTemplate.getForEntity("http://XXPAY-SERVICE/mch_info/select?jsonParam=" + MyBase64.encode(jsonParam.getBytes()), String.class).getBody();
}
public String selectMchInfoFallback(String jsonParam) {
return "error";
}
}
\ No newline at end of file
package org.xxpay.web.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import org.xxpay.common.util.MyBase64;
/**
* @Description:
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@Service
public class PayChannelServiceClient {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "selectPayChannelFallback")
public String selectPayChannel(String jsonParam) {
return restTemplate.getForEntity("http://XXPAY-SERVICE/pay_channel/select?jsonParam=" + MyBase64.encode(jsonParam.getBytes()), String.class).getBody();
}
public String selectPayChannelFallback(String jsonParam) {
return "error";
}
}
\ No newline at end of file
package org.xxpay.web.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.xxpay.common.util.MyBase64;
/**
* @Description:
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@Service
public class PayOrderServiceClient {
@Autowired
RestTemplate restTemplate;
/**
* 创建支付订单
* @param jsonParam
* @return
*/
@HystrixCommand(fallbackMethod = "createPayOrderFallback")
public String createPayOrder(String jsonParam) {
return restTemplate.getForEntity("http://XXPAY-SERVICE/pay/create?jsonParam=" + MyBase64.encode(jsonParam.getBytes()), String.class).getBody();
}
public String createPayOrderFallback(String jsonParam) {
return "error";
}
/**
* 处理微信支付
* @param jsonParam
* @return
*/
@HystrixCommand(fallbackMethod = "doWxPayReqFallback")
public String doWxPayReq(String jsonParam) {
return restTemplate.getForEntity("http://XXPAY-SERVICE/pay/channel/wx?jsonParam=" + MyBase64.encode(jsonParam.getBytes()), String.class).getBody();
}
public String doWxPayReqFallback(String jsonParam) {
return "error";
}
/**
* 处理支付宝wap支付
* @param jsonParam
* @return
*/
@HystrixCommand(fallbackMethod = "doAliPayWapReqFallback")
public String doAliPayWapReq(String jsonParam) {
return restTemplate.getForEntity("http://XXPAY-SERVICE/pay/channel/ali_wap?jsonParam=" + MyBase64.encode(jsonParam.getBytes()), String.class).getBody();
}
public String doAliPayWapReqFallback(String jsonParam) {
return "error";
}
/**
* 处理支付宝即时到账支付
* @param jsonParam
* @return
*/
@HystrixCommand(fallbackMethod = "doAliPayPcReqFallback")
public String doAliPayPcReq(String jsonParam) {
return restTemplate.getForEntity("http://XXPAY-SERVICE/pay/channel/ali_pc?jsonParam=" + MyBase64.encode(jsonParam.getBytes()), String.class).getBody();
}
public String doAliPayPcReqFallback(String jsonParam) {
return "error";
}
/**
* 处理支付宝手机支付
* @param jsonParam
* @return
*/
@HystrixCommand(fallbackMethod = "doAliPayMobileReqFallback")
public String doAliPayMobileReq(String jsonParam) {
return restTemplate.getForEntity("http://XXPAY-SERVICE/pay/channel/ali_mobile?jsonParam=" + MyBase64.encode(jsonParam.getBytes()), String.class).getBody();
}
public String doAliPayMobileReqFallback(String jsonParam) {
return "error";
}
}
\ No newline at end of file
spring:
application:
name: xxpay-web
cloud:
config:
discovery:
enabled: true # 默认false,设为true表示使用注册中心中的configserver配置而不自己配置configserver的uri
serviceId: xxpay-config # 指定config server在服务发现中的serviceId,默认为:configserver
fail-fast: true
password: xxpay
username: user
eureka:
client:
serviceUrl:
defaultZone: http://localhost:2000/eureka/
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment