Java服务器端微信支付V3版本功能实现

1. 首先在微信后台申请得到4个串,分别是:appid、appsecret、partner(商户号  )、partnerkey(商户在微信平台设置的32位长度的api秘钥)。

2. 手机端想要调起微信sdk进行支付,需要7个参数,分别是:appId、partnerId、prepayId、packageValue、nonceStr、timeStamp、sign,这7个参数从服务器获取。

 public static final String createOrderURL="https://api.mch.weixin.qq.com/pay/unifiedorder";  

Map<String, Object> map = new HashMap<String, Object>();

request.setCharacterEncoding("UTF-8");

String money = money_amount;// 获取订单金额

// 金额转化为分为单位
float sessionmoney = Float.parseFloat(money);
String finalmoney = String.format("%.2f", sessionmoney);
finalmoney = finalmoney.replace(".", "");
String currTime = TenpayUtil.getCurrTime();
// 8位日期
String strTime = currTime.substring(8, currTime.length());
// 四位随机数
String strRandom = TenpayUtil.buildRandom(4) + "";
// 10位序列号,可以自行调整。
String strReq = strTime + strRandom;
// 商户号
String mch_id = partner_pay;
// 子商户号 非必输
// String sub_mch_id="";
// 设备号 非必输
String device_info = "";
// 随机数
String nonce_str = strReq;
String body = "大智慧高尔夫-用户充值G币";
// 附加数据
// String attach = userId;
String attach = user_id;
// 商户订单号
// String out_trade_no =
// order.getSn()+"|"+System.currentTimeMillis();//订单编号加时间戳
String out_trade_no = "golf" + System.currentTimeMillis(); 
int intMoney = Integer.parseInt(finalmoney);
// 总金额以分为单位,不带小数点
String total_fee = String.valueOf(intMoney);
// 订单生成的机器 IP
String spbill_create_ip = request.getRemoteAddr();
// String spbill_create_ip = "14.23.150.211"; // 本机 测试
String notify_url = WeixinPayConstants.notify_url;// 微信异步通知地址
String trade_type = "APP";// app支付必须填写为APP
// 对以下字段进行签名
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", appid_pay);
packageParams.put("attach", attach);
packageParams.put("body", body);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("notify_url", notify_url);
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("total_fee", total_fee);
packageParams.put("trade_type", trade_type);
RequestHandler reqHandler = new RequestHandler(request, response);
reqHandler.init(appid_pay, appsecret_pay, partnerkey_pay);
String sign = reqHandler.createSign(packageParams);// 获取签名

String xml = "<xml>" + "<appid>" + appid_pay + "</appid>"
+ "<attach>" + attach + "</attach>" + "<body><![CDATA["
+ body + "]]></body>" + "<mch_id>" + mch_id + "</mch_id>"
+ "<nonce_str>" + nonce_str + "</nonce_str>"
+ "<notify_url>" + notify_url + "</notify_url>"
+ "<out_trade_no>" + out_trade_no + "</out_trade_no>"
+ "<spbill_create_ip>" + spbill_create_ip
+ "</spbill_create_ip>" + "<total_fee>" + total_fee
+ "</total_fee>" + "<trade_type>" + trade_type
+ "</trade_type>" + "<sign>" + sign + "</sign>" + "</xml>";

String allParameters = "";
try {
allParameters = reqHandler.genPackage(packageParams);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String createOrderURL = WeixinPayConstants.createOrderURL;

String prepay_id = "";
try {
prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);

if (prepay_id.equals("")) {
map.put("msg", "error");
return;
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

// 获取到prepayid后对以下字段进行签名最终发送给app
SortedMap<String, String> finalpackage = new TreeMap<String, String>();
String timestamp = Sha1Util.getTimeStamp();
finalpackage.put("appid", appid_pay);
finalpackage.put("timestamp", timestamp);
finalpackage.put("noncestr", nonce_str);
finalpackage.put("partnerid", WeixinPayConstants.partner);
finalpackage.put("package", "Sign=WXPay");
finalpackage.put("prepayid", prepay_id);
String finalsign = reqHandler.createSign(finalpackage);

map.put("appid", appid_pay);
map.put("timestamp", timestamp);
map.put("noncestr", nonce_str);
map.put("partnerid", WeixinPayConstants.partner);
map.put("prepayid", prepay_id);
map.put("package", "Sign=WXPay");
map.put("sign", finalsign);

JsonUtil.Gson(os, map, ErrorCodeDefine.S_OK);

3. 客户端支付完成后,微信会访问上面留下的 notify_url ,并传入支付信息,服务器收到后处理自己的业务。

                        request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");

                        InputStream in = request.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.close();
in.close();
String msgxml = new String(out.toByteArray(), "utf-8");// xml数据

Map map = new GetWxOrderno().doXMLParse(msgxml);
String result_code = (String) map.get("result_code");
String out_trade_no = (String) map.get("out_trade_no"); // 商户订单号
String total_fee = (String) map.get("total_fee"); // 订单总金额,单位为分
String sign = (String) map.get("sign");
Double amount = new Double(total_fee) / 100; // 获取订单金额
String user_id = (String) map.get("attach");
String sn = out_trade_no.split("\\|")[0];// 获取订单编号

if (result_code.equals("SUCCESS")) {
// 验证签名
float sessionmoney = Float.parseFloat(amount.toString());
String finalmoney = String.format("%.2f", sessionmoney);
finalmoney = finalmoney.replace(".", "");
int intMoney = Integer.parseInt(finalmoney);
// 总金额以分为单位,不带小数点
String order_total_fee = String.valueOf(intMoney);
String fee_type = (String) map.get("fee_type");
String bank_type = (String) map.get("bank_type");
String cash_fee = (String) map.get("cash_fee");
String is_subscribe = (String) map.get("is_subscribe");
String nonce_str = (String) map.get("nonce_str");
String openid = (String) map.get("openid");
String return_code = (String) map.get("return_code");
String sub_mch_id = (String) map.get("sub_mch_id");
String time_end = (String) map.get("time_end");
String trade_type = (String) map.get("trade_type");
String transaction_id = (String) map.get("transaction_id");
// 需要对以下字段进行签名
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", appid_pay);
packageParams.put("attach", user_id); // 用自己系统的数据:会员id
packageParams.put("bank_type", bank_type);
packageParams.put("cash_fee", cash_fee);
packageParams.put("fee_type", fee_type);
packageParams.put("is_subscribe", is_subscribe);
packageParams.put("mch_id", partner_pay);
packageParams.put("nonce_str", nonce_str);
packageParams.put("openid", openid);
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("result_code", result_code);
packageParams.put("return_code", return_code);
packageParams.put("sub_mch_id", sub_mch_id);
packageParams.put("time_end", time_end);
packageParams.put("total_fee", order_total_fee); // 用自己系统的数据:订单金额
packageParams.put("trade_type", trade_type);
packageParams.put("transaction_id", transaction_id);
RequestHandler reqHandler = new RequestHandler(request,response);
reqHandler.init(appid_pay, appsecret_pay, partnerkey_pay);
String endsign = reqHandler.createSign(packageParams);
if (sign.equals(endsign)) {// 验证签名是否正确
(处理自己的业务,注意要能够处理重复的通知。)
response.getWriter().write(setXml("SUCCESS", "OK")); // 告诉微信已经收到通知了


    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值