[微信]微信小程序/Java實現微信支付

   @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;
    
    	}
    
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章