@Controller
@RequestMapping("/pay")
public class WeChatPayController {
public final static Logger logger = LoggerFactory.getLogger(WeChatPayController.class);
public final static String CREATE_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
/**
* appid 小程序id 微信公众平台 设置中的开发设置中可以查到,相当于qq的qq号 建议单独创建一个配置文件储存此类值和函数
*/
public static final String APPID = "APPID";
/**
* AppSecret 小程序密钥 微信公众平台
*/
public static final String SECRET = "AppSecret";
/**
* 用于获取用户openid的接口网址 其中%s将会用String.format函数替换为实际的值 建议单独储存
*/
public static final String Web_access_tokenhttps = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
@Autowired
private IUserService userService;
@Autowired
private IPaymentConfigService paymentConfigService;
@Autowired
private IBookService bookService;
/**
* 通过APPID,SECET,code组合出用于获取用户openid的实际网址 建议单独储存
*/
public static String getWebAccess(String code) {
return String.format(Web_access_tokenhttps, APPID, SECRET, code);
}
/**
* 获取微信支付的各种参数 orderNo(子系统商户唯一订单号,下单时通过时间戳算法生成)
* totalMoney(支付总金额,单位为分列:7元==700)
* sysFlag(子系统标志,通知此标志获得微信商户参数)
* session(通过session和sysFlag获得当前登录用户的openId)
*
*
* @return
* @throws Exception
*/
@RequestMapping(value = "/getWxPayParameters.do")
@ResponseBody
public FOURYOU_WX_PAY_PARAMETERS_VO getWxPayParameters(String code, String ip, String totalMoney,
HttpServletRequest request, HttpServletResponse response, String body, String type) throws Exception {
if (code.equals(null)) {
throw new Exception("未登录用户,请重新扫描二维码进入小程序!!!");
}
logger.info("=========getWxPayParameters.do==========:{ffffff}", totalMoney);
logger.info("=========getWxPayParameters.do==========:{}", request);
RequestHandler reqHandler = new RequestHandler(request, response);
String APPID = "APPID";
String token = getWebAccess(code);
String rec = httpGet(token);
logger.info("======微信回执为:{}", rec);
JSONObject json = JSON.parseObject(rec);
String openId = json.getString("openid");
if (openId == null) {
throw new Exception("登陆失败,请重新退出登陆!!!");
}
FOURYOU_WX_PAY_PARAMETERS_VO payParameters;
user_register user = userService.findOpenId(openId);
String orderNo = TenpayUtil.makeOrderNumber(user.getUser_id());
String Secret = "";
FOURYOU_WX_PAY_CONFIG wxPayConfig = userService.getConfig(APPID);
SortedMap<String, String> wxPackageParams = getWxJsapiParams(orderNo, ip, openId, totalMoney, APPID,
wxPayConfig, body, type);
reqHandler.init(String.valueOf(APPID), Secret, wxPayConfig.getPARTNER_KEY());
/*****************************************************/
logger.info("支付");
// reqHandler.genPackage(wxPackageParams);
wxPackageParams.put("sign", reqHandler.createSign(wxPackageParams));
logger.info(wxPackageParams.get("sign") + "sing");
String prepay_id = GetWxOrderno.getPayNo(CREATE_ORDER_URL, XMLUtil.map2xmlBody(wxPackageParams, "xml"));
if (prepay_id.equals("")) {
logger.info("error:统一支付接口下单失败");
throw new Exception("error:统一支付接口下单失败");
}
SortedMap<String, String> finalpackage = new TreeMap<String, String>();
String nonceStr2 = wxPackageParams.get("nonce_str");// 二次签名的随机串需要用微信返回的
String packages = "prepay_id=" + prepay_id;
finalpackage.put("appId", String.valueOf(APPID));
finalpackage.put("timeStamp", Sha1Util.getTimeStamp());
finalpackage.put("nonceStr", nonceStr2);
finalpackage.put("package", packages);
finalpackage.put("signType", "MD5");
payParameters = new FOURYOU_WX_PAY_PARAMETERS_VO();
payParameters.setAPPID(String.valueOf(APPID));
payParameters.setTIME_STAMP(Sha1Util.getTimeStamp());
payParameters.setNONCE_STR(nonceStr2);
payParameters.setPACKAGE(packages);
payParameters.setPrepay_id(prepay_id);
payParameters.setSIGN(reqHandler.createSign(finalpackage));
payParameters.setTotal_fee(Integer.valueOf(totalMoney));
return payParameters;
}
/**
* 通过HttpGet类发送GET请求并获取返回信息
*
* @param path
* 发送至的网址
* @return
*/
public String httpGet(String path) {
if (path == null) {
return null;
}
String rec = null;
HttpGet get = new HttpGet(path);
try {
HttpResponse response = HttpClients.createDefault().execute(get);
HttpEntity entity = response.getEntity();
rec = EntityUtils.toString(entity);
} catch (IOException e) {
e.printStackTrace();
}
return rec;
}
/**************************************** WX_PAY ******************************************/
/**
* 获取微信支付(JSAPI)packageParams
*
* @throws Exception
*/
@RequestMapping("/getWxJsapiParams.do")
@ResponseBody
public SortedMap<String, String> getWxJsapiParams(String orderNo, String spbill_create_ip, String openId,
String totalMoney, String appId, FOURYOU_WX_PAY_CONFIG wxPayConfig, String body, String type)
throws Exception {
String currTime = TenpayUtil.getCurrTime();
String backUrl = "http://xxxxx/pay/rechargeAccout.do";// 下一个方法:充值
String strTime = currTime.substring(8, currTime.length());
String strRandom = TenpayUtil.buildRandom(4) + "";
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", String.valueOf(appId));// 小程序ID
packageParams.put("mch_id", wxPayConfig.getPARTNER());// 商户号
packageParams.put("nonce_str", strTime + strRandom);
packageParams.put("body", body);
packageParams.put("attach", type+","+body);
packageParams.put("out_trade_no", orderNo);// 商户订单号
packageParams.put("total_fee", totalMoney);// 支付金额,这边需要转成字符串类型,否则后面的签名会失败
packageParams.put("spbill_create_ip", spbill_create_ip);// 终端IP
packageParams.put("notify_url", backUrl);// 支付成功后的回调地址
packageParams.put("trade_type", "JSAPI");// 交易类型
packageParams.put("openid", openId);// 用户标识
logger.info("微信支付付款金额:====================>" + totalMoney +"\n=======================>>>>"+ "notifyUrl:" + backUrl);
return packageParams;
}
/**
* 充值
*
* @param totalMoney
* 充值金额(分)
* @param userId
* 用户ID
* @param ip
* 终端ip
* @param type
* 区别充值的是押金还是账户充值
* @throws Exception
*/
@SuppressWarnings("unchecked")
@RequestMapping("/rechargeAccout.do")
@ResponseBody
public String rechargeAccout(HttpServletRequest request) throws Exception {
Map<String, String> map = new HashMap<String, String>();
logger.info("=============rechargeAccout.do===start:=================");
String APPID = "APPID";
FOURYOU_WX_PAY_CONFIG config = userService.getConfig(APPID);
try {
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());
// 释放资源
inputStream.close();
inputStream = null;
} catch (Exception e) {
e.printStackTrace();
}
// 验证是否是微信发来的回调
if (!(map.get("mch_id").equals(config.getPARTNER()))) {
return null;
}
String openId = map.get("openid");
logger.info("================openid:=================" + openId);
try {
logger.info("=============rechargeAccout.do=== fffff:=================");
// 查询openId
user_register reuser = userService.findOpenId(openId);
if (null == reuser) {
throw new Exception("未登录!");
}
// 根据userID和订单号查询订单信息
String orderNO = String.valueOf(map.get("out_trade_no"));
payment_config pay = new payment_config();
pay.setUser_id(reuser.getUser_id());
pay.setOrderid(orderNO);
payment_config userRecord = userService.getPayRecord(pay);
user_book findLandlord = new user_book();
findLandlord.setRent_user_id(reuser.getUser_id());// 租客编号
logger.info("=====bookService.queryLandlord======findLandlord:" + findLandlord);
// 根据租客编号 Rent_user_id 查询房东编号
user_book booklist = bookService.queryLandlord(findLandlord);
logger.info("=====查询房东USER_ID=====bookService.queryLandlord======:" + booklist);
user_account user1 = userService.SelectUserAmount(booklist.getUser_id());
logger.info("======== userService.SelectUserAmount ======= END =========:" + user1);
// 处理微信多次调用
if (userRecord != null) {
if (map.get("out_trade_no").equals(userRecord.getOrderid())) {
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
}
logger.info("======添加支付记录 到交易流水表======== 开始 ==========");
// 查询某用户的余额
// user_account user =
// userService.SelectUserAmount(reuser.getUser_id());
logger.info("======添加支付记录 到交易流水表======== 开始 ==========" + map.get("attach"));
String[] attac = map.get("attach").split(",");
logger.info("======添加支付记录 到交易流水表======== 开始 attach[0]+attach[1] ==========" +attac[0]+"fffffffffff"+attac[1]);
payment_config userRecord1 = new payment_config();// attach 附加数据
if (attac[0].equals("充值")) {
logger.info("====paymentConfigService.addwithdraw ========开始==========添加资金记录:" + userRecord);
// 添加语句 添加添加交易流水 资金记录
if (userRecord == null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
userRecord1.setAbstracts("交租");
Date date = sdf.parse((String) map.get("time_end"));
userRecord1.setBalance(Integer.valueOf(map.get("total_fee")));
userRecord1.setOrderid((String) map.get("out_trade_no"));
userRecord1.setTrading_time(date);
userRecord1.setUser_id(reuser.getUser_id());
logger.info("======房源的 HID:" + booklist.getHid());
logger.info("======房东的 USERID:" + booklist.getUser_id());
userRecord1.setHid(booklist.getHid());
userRecord1.setPaytype("微信支付");
userRecord1.setStatus("成功");
// 添加语句 添加 payconfig资金记录
paymentConfigService.addwithdraw(userRecord1);// 添加提现记录
if (null != userRecord1) {
logger.info("添加资金记录:");
}
logger.info("===========paymentConfigService.addwithdraw=====END=======添加资金记录:");
logger.info("==========添加资金流水记录=======成功======:");
// attach 附加数据
int Money = Integer.valueOf(user1.getMoney()) + Integer.valueOf(map.get("total_fee"));
logger.info("======支付房租金额:" + Integer.valueOf(map.get("total_fee")) + "======账户原有金额:"
+ Integer.valueOf(user1.getMoney()) + "======增加加资金记录 Money:" + Money);
user1.setMoney(Money);
user1.setUser_id(booklist.getUser_id());
logger.info("======房东的 USER_ID:" + booklist.getUser_id());
// logger.info("======添加房东收租记录D:" + booklist.getUser_id());
// payment_config userRecord2 = new payment_config();
// userRecord2.setAbstracts("收租");
// userRecord2.setBalance(Integer.valueOf(map.get("total_fee"))
// );
// userRecord2.setOrderid((String) map.get("out_trade_no"));
// userRecord2.setTrading_time(date);
// userRecord2.setUser_id(booklist.getUser_id());
// userRecord2.setPaytype("微信支付");
// userRecord2.setStatus("成功");
// addID = paymentConfigService.addwithdraw(userRecord2);//
// 添加提现记录
logger.info("=========paymentConfigService.updataUserAccount == 开始 ===user1:" + user1);
// 更新账户
int balance = paymentConfigService.updataUserAccount(user1);
logger.info("=========paymentConfigService.updataUserAccount == END ===balance:" + balance);
logger.info("=========修改账户余额======成功=====");
String settle = "是";
int user_id = Integer.valueOf((reuser.getUser_id()));// 房客user_id
logger.info("=====房客的===USER_ID=====:" + user_id);
// 修改交租记录表 状态
rentPayment payment = new rentPayment();
payment.setSettle(settle);
payment.setTrading_time(new Date());// 当前时间
payment.setUser_id(user_id);
payment.setTitle(attac[1]);
int modify = paymentConfigService.updatePaid(payment);
logger.info("=========修改账单状态======成功=====:" + modify);
}
}
} catch (Exception e) {
logger.info("======添加支付记录 到交易流水表========== 失败 ====================");
}
// 校验是否为真
if (map.get("result_code").equals("SUCCESS")) {
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
return null;
}
}
[微信]微信小程序/Java实现微信支付
最新推荐文章于 2024-07-29 10:54:32 发布