验证中...
Languages: Java
Categories: 常用工具包
Latest update 2018-02-07 11:05
Snippet 1 Snippet 2 Snippet 3 Snippet 4
gistfile1.txt
Raw Copy
/**
* 接口编号【125】 接口描述【微信支付】
*
* @param price
* 充值金额
* @author chenp
* @return
* @throws Exception
*/
@RequestMapping(value = "v1/wechat_recharge", method = RequestMethod.POST)
public @ResponseBody
RespValue<Object> WeiXinPayFor(HttpServletRequest request,
HttpServletResponse response, int price) throws Exception {
if (this.unlawfulRequest(125, request)) {
return new RespValue<Object>(null, RespCode.UNLAWFULREQ);
}
if (price <= 0) {
throw new ServiceException("参数不能为空!");
}
UserLogin userLogin = (UserLogin) request.getSession().getAttribute(
"userLogin");
if (null == userLogin) {
return new RespValue<Object>(null, RespCode.TIMEOUT);
}
WeChatParams ps = new WeChatParams();
// 附加参数【业务类型_会员ID_订单号】
ps.attach = "会员充值" + "_" + userLogin.getId();
ps.out_trade_no = StringUtils.getBetOrderNo();
if ("true".equalsIgnoreCase(WeChatConfig.WXPAY)) {
ps.total_fee = String.valueOf(price * 100);
} else {
ps.total_fee = "1";// 以分为单位
}
// 商品名称
ps.body = "会员充值";
Map<Object, Object> map = WeixinPayApp.getCodeUrl(ps);
return new RespValue<Object>(map, "获取成功", RespValue.SUCCESS);
}
/**
* APP端微信充值【回调方法】
*
* @param request
* @param response
* @throws Exception
*/
@SuppressWarnings({ "unchecked", "unused" })
@RequestMapping(value = "v1/app_wechat_notify_url", method = RequestMethod.POST)
public void wechat_notify_url_app(HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 读取参数
InputStream inputStream;
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
String s;
BufferedReader in = new BufferedReader(new InputStreamReader(
inputStream, "UTF-8"));
while ((s = in.readLine()) != null) {
sb.append(s);
}
in.close();
inputStream.close();
// 解析xml成map
Map<String, String> m = new HashMap<String, String>();
m = XMLUtil.doXMLParse(sb.toString());
// 过滤空 设置 TreeMap
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
Iterator<String> it = m.keySet().iterator();
while (it.hasNext()) {
String parameter = it.next();
String parameterValue = m.get(parameter);
String v = "";
if (null != parameterValue) {
v = parameterValue.trim();
}
packageParams.put(parameter, v);
}
// 微信支付的API密钥
String key = WeChatConfig.APIKEY_APP; // key
// 判断签名是否正确
if (PayForUtil.isTenpaySign("UTF-8", packageParams, key)) {
// ------------------------------
// 处理业务开始
// ------------------------------
String resXml = "";
if ("SUCCESS".equals((String) packageParams.get("result_code"))) {
// 这里是支付成功
// 执行自己的业务逻辑开始
String app_id = (String) packageParams.get("appid");
String mch_id = (String) packageParams.get("mch_id");
String openid = (String) packageParams.get("openid");
String is_subscribe = (String) packageParams
.get("is_subscribe");// 是否关注公众号
// 附加参数【会员充值_0bda32824db44d6f9611f1047829fa3b】--【业务类型_会员ID_订单号】
String attach = (String) packageParams.get("attach");
// 商户订单号
String out_trade_no = (String) packageParams
.get("out_trade_no");
// 付款金额【以分为单位】
String total_fee = (String) packageParams.get("total_fee");
// 微信生成的交易订单号
String transaction_id = (String) packageParams
.get("transaction_id");// 微信支付订单号
// 支付完成时间
String time_end = (String) packageParams.get("time_end");
String businessType = "";// 业务类型
String memberId = "";// 会员ID
if (attach.indexOf("_") > -1) {
String[] bodys = attach.split("_");
businessType = bodys[0];
memberId = bodys[1];
}
if (businessType.equals("会员充值") && memberId.length() > 0) {
// -----------------修改用户充值记录----------------//
PayInfo pay = new PayInfo();
pay.setAddtime(new Date());
pay.setBody(attach);
pay.setMemberId(memberId);
pay.setOut_trade_no(out_trade_no);
pay.setPaytype(2);
pay.setTotal_fee(Integer.parseInt(total_fee) / 100 + "");
pay.setTradeno(transaction_id);
pay.setBuz_type(businessType);
userService.recharge(pay);
}
// 执行自己的业务逻辑结束
// 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
resXml = "<xml>"
+ "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
} else {
resXml = "<xml>"
+ "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]]></return_msg>"
+ "</xml> ";
}
// ------------------------------
// 处理业务完毕
// ------------------------------
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
}
}
WeChatParams.java
Raw Copy
package com.lottery.wechat.utils;
/**
* 微信支付需要的一些参数
* @author chenp
*
*/
public class WeChatParams {
public String total_fee;//订单金额【备注:以分为单位】
public String body;//商品名称
public String out_trade_no;//商户订单号
public String attach;//附加參數
public String memberid;//会员ID
}
WeChatConfig.java
Raw Copy
package com.lottery.wechat.utils;
/**
* 微信支付配置文件
* @author chenp
*
*/
public class WeChatConfig {
/**
* 微信服务号APPID
*/
public static String APPID_APP="wxa9dc06113fe3c758";
/**
* 微信支付的商户号
*/
public static String MCHID_APP="1463625102";
/**
* 微信支付的API密钥
*/
public static String APIKEY_APP="OchYg8NUN1sXagp8m1GYRujj7lc1fozG";
/**
* 微信支付成功之后的回调地址【注意:当前回调地址必须是公网能够访问的地址】
*/
public static String WECHAT_NOTIFY_URL_APP="http://118.89.35.44/app/v1/app_wechat_notify_url.do";
/**
* 微信下单API地址
*/
public static String UFDODER_URL="https://api.mch.weixin.qq.com/pay/unifiedorder";
/**
* true为使用真实金额支付,false为使用测试金额支付(1分)
*/
public static String WXPAY="false";
}
WeixinPayApp.java
Raw Copy
package com.lottery.wechat.utils;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
/**
* 微信支付【app】
* @author Administrator
*
*/
public class WeixinPayApp {
public static Logger lg=Logger.getLogger(WeixinPayApp.class);
private static final int BLACK = 0xff000000;
private static final int WHITE = 0xFFFFFFFF;
/**
* 获取微信支付的二维码地址
* @return
* @author chenp
* @throws Exception
*/
public static Map<Object,Object> getCodeUrl(WeChatParams ps) throws Exception {
/**
* 账号信息
*/
String appid = WeChatConfig.APPID_APP;//微信服务号的appid
String mch_id = WeChatConfig.MCHID_APP; //微信支付商户号
String key = WeChatConfig.APIKEY_APP; // 微信支付的API密钥
String notify_url = WeChatConfig.WECHAT_NOTIFY_URL_APP;//回调地址【注意,这里必须要使用外网的地址】
String ufdoder_url=WeChatConfig.UFDODER_URL;//微信下单API地址
String trade_type = "APP"; //类型【app支付】
/**
* 时间字符串
*/
String currTime = PayForUtil.getCurrTime();
String strTime = currTime.substring(8, currTime.length());
String strRandom = PayForUtil.buildRandom(4) + "";
String nonce_str = strTime + strRandom;
/**
* 参数封装
*/
SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);//随机字符串
packageParams.put("body", ps.body);//支付的商品名称
packageParams.put("out_trade_no", ps.out_trade_no+nonce_str);//商户订单号【备注:每次发起请求都需要随机的字符串,否则失败。】
packageParams.put("total_fee", ps.total_fee);//支付金额
packageParams.put("spbill_create_ip", PayForUtil.localIp());//客户端主机
packageParams.put("notify_url", notify_url);
packageParams.put("trade_type", trade_type);
packageParams.put("attach", ps.attach);//额外的参数【业务类型+会员ID+支付类型】
String sign = PayForUtil.createSign("UTF-8", packageParams,key); //获取签名
System.out.println("sign:---"+sign);
packageParams.put("sign", sign);
String requestXML = PayForUtil.getRequestXml(packageParams);//将请求参数转换成String类型
lg.info("微信支付请求参数的报文"+requestXML);
String resXml = HttpUtil.postData(ufdoder_url,requestXML); //解析请求之后的xml参数并且转换成String类型
lg.info("微信支付响应参数的报文"+resXml);
Map<Object,Object>map = XMLUtil.doXMLParse(resXml);
if("SUCCESS".equals(map.get("result_code"))){
//二次签名
SortedMap<Object,Object> sp = new TreeMap<Object,Object>();
sp.put("appid", appid);
sp.put("partnerid", mch_id);
sp.put("prepayid", map.get("prepay_id"));
sp.put("noncestr", map.get("nonce_str"));
sp.put("timestamp", (System.currentTimeMillis()/1000)+"");
sp.put("package", "Sign=WXPay");
String spsign=PayForUtil.createSign("UTF-8",sp,key); //签名
System.out.println("spsign:---"+spsign);
map.put("sign", spsign);
map.put("timestamp", sp.get("timestamp"));
map.put("packageValue", "Sign=WXPay");
}else{
lg.info("调用微信统一下单接口失败");
}
return map;
}
/**
* 将路径生成二维码图片
* @author chenp
* @param content
* @param response
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void encodeQrcode(String content,HttpServletResponse response){
if(StringUtils.isBlank(content))
return;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map hints = new HashMap();
BitMatrix bitMatrix = null;
try {
bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 250, 250,hints);
BufferedImage image = toBufferedImage(bitMatrix);
//输出二维码图片流
try {
ImageIO.write(image, "png", response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
} catch (WriterException e1) {
e1.printStackTrace();
}
}
/**
* 类型转换
* @author chenp
* @param matrix
* @return
*/
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) == true ? BLACK : WHITE);
}
}
return image;
}
// 特殊字符处理
public static String UrlEncode(String src) throws UnsupportedEncodingException {
return URLEncoder.encode(src, "UTF-8").replace("+", "%20");
}
}

Comment list( 0 )

You need to Sign in for post a comment

6_float_left_people 6_float_left_close