java 单机接口限流处理方案
691
2022-12-25
本文目录一览:
微信支付jsapi(java版),具体代码如下:
代码太多,更多代码请访问http://www.vxzsk.com/394.html
1. 项目使用springmvc restful风格的,需要用到jar包请自行下载
2. 整个项目只需要修改com.tenpay.configure.WxPayConfig中的配置信息就行。
// appid
public static String APP_ID = "公众id";
// JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
public static String APP_SECRET = "公众号中的秘钥";
// 受理商ID,身份标识
public static String MCH_ID = "商户id";
// 商户支付密钥Key,装完整数后,配置得到。32位长度
public static String KEY = "商户平台中配置证书,设置的秘钥";
// 异步回调地址
public static String NOTIFY_URL = "支付成功后的回调action";
public static String CHARTSET = "UTF-8";
// 加密方式
public static String SIGN_TYPE = "MD5";
// redirect_uri,微信授权重定向地址
public static String REDIRECT_URI;
static {
try {
REDIRECT_URI = URLEncoder.encode("微信授权成功后重定向的action", CHARTSET);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
3. 项目核心类com.tenpay.action.WxPayAction
pay函数:支付前准备函数,从数据库获取订单号,查询订单金额,订单描述、openid、prepay_id等等。
notify函数:支付成功后异步回调函数。
一、新建基于springMVC框架的javaweb项目名字为wxPay
二、java代码实现
2.1 com.tenpay.action.WxPayAction代码
package com.tenpay.action;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jdom2.JDOMException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.tenpay.RequestHandler;
import com.tenpay.configure.WxPayConfig;
import com.tenpay.service.ServiceUtil;
import com.tenpay.util.MD5Util;
import com.tenpay.util.Sha1Util;
import com.tenpay.util.XMLUtil;
import net.sf.json.JSONObject;
/*******************************************************************************
* <b类名: WxPayAction.java</b <br/
* 功能:微信支付,调用jsapi<br/
* 日期:<br/
*
* @author V型知识库 www.vxzsk.com
* @version 1.0
*
******************************************************************************/
@Controller
@RequestMapping("/v_3")
public class WxPayAction {
/**
* 微信客户端授权成功后根据redirect_uri参数调整到pay接口,去准备支付前信息接口
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping("pay")
public String order(HttpServletRequest request, HttpServletResponse response) throws Exception {
/**
* 第一步:用户同意授权,根据参数,获取code
* 授权成功后返回的授权码,参考:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code
*/
String code = request.getParameter("code");
String state = request.getParameter("state");
// state可以为任何含义,根据你前端需求,这里暂时叫商品id
// 授权码、商品id
System.out.println("code=" + code + ",state=" + state);
/**
* 第二步:通过code换取网页授权access_token
* 根据授权码code获取access_token,参考:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E7.AC.AC.E4.BA.8C.E6.AD.A5.EF.BC.9A.E9.80.9A.E8.BF.87code.E6.8D.A2.E5.8F.96.E7.BD.91.E9.A1.B5.E6.8E.88.E6.9D.83access_token
*/
// 下面就到了获取openid,这个代表用户id.
// 获取openID
String openid = ServiceUtil.getOpenId(code);
// 生成随机字符串
String noncestr = Sha1Util.getNonceStr();
// 生成1970年到现在的秒数.
String timestamp = Sha1Util.getTimeStamp();
// 订单号,自定义生成规则,只要全局唯一就OK
String out_trade_no = "NO" + System.currentTimeMillis() + "0001";
// 订单金额,应该是根据state(商品id)从数据库中查询出来
String order_price = String.valueOf(1);
// 商品描述,应该是根据state(商品id)从数据库中查询出来
String body = "商品描述,测试....";
/**
* 第三步:统一下单接口
* 需要第二步生成的openid,参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
*/
RequestHandler reqHandler = new RequestHandler(request, response);
// 初始化 RequestHandler 类可以在微信的文档中找到.还有相关工具类
reqHandler.init();
// 执行统一下单接口 获得预支付id,一下是必填参数
// 微信分配的公众账号ID(企业号corpid即为此appId)
reqHandler.setParameter("appid", WxPayConfig.APP_ID);
// 微信支付分配的商户号
reqHandler.setParameter("mch_id", WxPayConfig.MCH_ID);
// 终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"
reqHandler.setParameter("device_info", "WEB");
// 随机字符串,不长于32位。推荐随机数生成算法
reqHandler.setParameter("nonce_str", noncestr);
// 商品描述
reqHandler.setParameter("body", body);
// 商家订单号
reqHandler.setParameter("out_trade_no", out_trade_no);
// 商品金额,以分为单位
reqHandler.setParameter("total_fee", order_price);
// APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
reqHandler.setParameter("spbill_create_ip", "123.57.58.123");
// 下面的notify_url是用户支付成功后为微信调用的action 异步回调.
reqHandler.setParameter("notify_url", WxPayConfig.NOTIFY_URL);
// 交易类型,取值如下:JSAPI,NATIVE,APP,详细说明见参数规定
reqHandler.setParameter("trade_type", "JSAPI");
// ------------需要进行用户授权获取用户openid-------------
reqHandler.setParameter("openid", openid); // 这个必填.
/*
* <xml<appidwx2421b1c4370ec43b</appid<attach支付测试</attach<body
* JSAPI支付测试</body<mch_id10000100</mch_id<nonce_str
* 1add1a30ac87aa2db72f57a2375d8fec</nonce_str<notify_urlhttp://wxpay.
* weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url<openid
* oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid<out_trade_no1415659990</
* out_trade_no<spbill_create_ip14.23.150.211</spbill_create_ip<
* total_fee1</total_fee<trade_typeJSAPI</trade_type<sign
* 0CB01533B8C1EF103065174F50BCA001</sign</xml
*/
// 生成签名,并且转为xml
String requestXml = reqHandler.getRequestXml();
System.out.println("requestXml:" + requestXml);
// 得到的预支付id
String prepay_id = ServiceUtil.unifiedorder(requestXml);
SortedMap<String, String params = new TreeMap<String, String();
params.put("appId", WxPayConfig.APP_ID);
params.put("timeStamp", timestamp);
params.put("nonceStr", noncestr);
params.put("package", "prepay_id=" + prepay_id);
params.put("signType", "MD5");
System.out.println("params:" + JSONObject.fromObject(params).toString());
// 生成支付签名,这个签名 给 微信支付的调用使用
SortedMap<Object,Object signMap = new TreeMap<Object,Object();
signMap.put("appId", WxPayConfig.APP_ID);
signMap.put("timeStamp", timestamp);
signMap.put("nonceStr", noncestr);
signMap.put("package", "prepay_id=" + prepay_id);
signMap.put("signType", "MD5");
// 微信支付签名
String paySign = MD5Util.createSign(signMap, WxPayConfig.KEY);
System.out.println("PaySIGN:" + paySign);
//微信分配的公众账号ID(企业号corpid即为此appId)
request.setAttribute("appId", WxPayConfig.APP_ID);
// 时间戳
request.setAttribute("timeStamp", timestamp);
// 随机字符串
request.setAttribute("nonceStr", noncestr);
// 预支付id ,就这样的格式
request.setAttribute("package", "prepay_id=" + prepay_id);
// 加密格式
request.setAttribute("signType", WxPayConfig.SIGN_TYPE);
// 微信支付签名
request.setAttribute("paySign", paySign);
return "pay";
}
/**
* 异步返回
*/
@RequestMapping("notify")
public String notify(HttpServletRequest request, HttpServletResponse response) {
try {
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
String resultStr = new String(outSteam.toByteArray(), WxPayConfig.CHARTSET);
Map<String, String resultMap = XMLUtil.doXMLParse(resultStr);
System.out.println("微信回调结果:" + resultMap.toString());
String result_code = resultMap.get("result_code");
String is_subscribe = resultMap.get("is_subscribe");
String out_trade_no = resultMap.get("out_trade_no");
String transaction_id = resultMap.get("transaction_id");
String sign = resultMap.get("sign");
String time_end = resultMap.get("time_end");
String bank_type = resultMap.get("bank_type");
String return_code = resultMap.get("return_code");
// 签名验证
// GenericValue userLogin = delegator.findOne("UserLogin", UtilMisc.toMap("userLoginId", "admin"), false);
if (return_code.equals("SUCCESS")) {
// 此处就是你的逻辑代码
// 修改数据库支付状态
}
request.setAttribute("out_trade_no", out_trade_no);
// 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
response.getWriter().write(RequestHandler.setXML("SUCCESS", ""));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
}
return "notify";
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~