微信商城中后台微信支付接口

加粗样式
微信支付和支付宝支付接口学起来简直一个天上一个地下。废话不多说写接口吧。
1.先定义好接口:
@CrossOrigin(origins = “")// 解决跨域
@GetMapping(“getPages/{orderId}”)
public Map<String,String> getPackage(@PathVariable String orderId, HttpServletRequest request, HttpServletResponse response, HttpSession session)
2.定义一个抽象上下文变量,再通过上下文边量获取到配置文件,在bean工厂中获取类信息
AbstractApplicationContext ctx = null;
try {
ctx = new ClassPathXmlApplicationContext(new String[]{“classpath:applicationContext.xml”});
}catch (Exception e){
e.printStackTrace();
}
3. //获取数据库中微信apppid,appsecret,partner,partnerkey,link 这些数据
WxSettingService wxSettingService = (WxSettingService)ctx.getBean(“wxSettingService”) ;
WxSetting wxSetting = wxSettingService.selectByPrimaryKey(1);
4.从session中获取oppenid
StringUtil stringUtil = new StringUtil();
String oppenId = stringUtil.getOppen_id(session);
5.获取到订单信息
OrderCon orderCon = orderConService.orderById(orderId);
6.获取参数
①商品描述
String goods_name =orderCon.getGoodsName();
if(goods_name.contains("-=")){
goods_name = goods_name.replace("-=", “”);
}
String body = goods_name;
②订单编号
String orderNo = orderCon.getOrderCard();
String out_trade_no = orderNo;
③订单总价
BigDecimal totalAmount = orderCon.getTotalAmount();
float money = totalAmount.floatValue();
int price = (int)(100 * money);//由于微信接口会把钱自动识别为分所以要
100
String totalFee = price+”";
④notify_url
String notify_url = wxSetting.getLink()+"/page/noticeOrder.html";
⑤商户号,每个公众平台都有自己的商户号
String mch_id = wxSetting.getPartner();
⑥10位序列号,可以自行调整。
String strTime = currTime.substring(6); // 8位日期
String strRandom = TenpayUtil.buildRandom(4) + “”;//四位随机数
String strReq = strTime + strRandom;
String nonce_str = strReq;
⑦ 附加数据 非必填
String attach = “”;
⑧终端IP 必填 支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP,在公众号没的设置
String spbill_create_ip =request.getRemoteAddr();
⑨微信支付方式,微信商城是jsapi支付
String trade_type = “JSAPI”;
⑩用户的oppenId
String openid = oppenId;
7.放入sortedMap中进行排序
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put(“appid”, wxSetting.getAppid());//公众账号ID 必填 微信支付分配的公众账号ID
packageParams.put(“mch_id”, wxSetting.getPartner());//商户号 必填 微信支付分配的商户号
packageParams.put(“nonce_str”, nonce_str);//随机字符串 必填 随机字符串,长度要求在32位以内
packageParams.put(“body”, body);//商品描述 必填 商品简单描述
packageParams.put(“attach”, attach);//附加数据 非必填
packageParams.put(“out_trade_no”, out_trade_no);//商户订单号 必填 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一
packageParams.put(“total_fee”, totalFee); //标价金额 必填 订单总金额,单位为分
packageParams.put(“spbill_create_ip”, spbill_create_ip);//终端IP 必填 支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP
packageParams.put(“notify_url”, notify_url);//通知地址 必填 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
packageParams.put(“trade_type”, trade_type);//交易类型 必填 JSAPI -JSAPI支付(公众号选用此类型) NATIVE -Native支付 APP -APP支付
packageParams.put(“openid”, openid);
8.获取签名的过程
*①初始化函数。
public void init(String app_id, String app_secret, String partner_key) {
this.last_errcode = “0”;
this.Token = “token_”;
this.debugInfo = “”;
this.appid = app_id;
this.partnerkey = partner_key;
this.appsecret = app_secret;
this.key = partner_key;
}
public void init() {
}
② 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
public String createSign(SortedMap<String, String> packageParams) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (null != v && !"".equals(v) && !“sign”.equals(k)
&& !“key”.equals(k)) {
sb.append(k + “=” + v + “&”);
}
}
sb.append(“key=” + this.getKey());
String sign = MD5Util.MD5Encode(sb.toString(), this.charset)
.toUpperCase();
return sign;
}
9.获取xml,也可以是json的格式
String xml = “” + “” + wxSetting.getAppid() + “” + “<mch_id>”
+ mch_id + “</mch_id>” + “<nonce_str>” + nonce_str
+ “</nonce_str>” + “” + sign + “”
+ “<![CDATA[" + body + "]]>” + “” + attach
+ “”
+ “<out_trade_no>”
+ out_trade_no
+ “</out_trade_no>”
+ “<total_fee>”
+ totalFee
+ “</total_fee>”
+ “<spbill_create_ip>” + spbill_create_ip + “</spbill_create_ip>”
+ “<notify_url>” + notify_url + “</notify_url>”
+ “<trade_type>” + trade_type + “</trade_type>” + “”
+ openid + “” + “”;
10.url 由微信提官方提供
String createOrderURL = “https://api.mch.weixin.qq.com/pay/unifiedorder”;
11.prepay_id 费这么大劲就是要获取这玩意
prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);
public static String getPayNo(String url, String xmlParam) {
log.info(“GetWxOrderno 35LINE xml是:” + xmlParam);
DefaultHttpClient client = new DefaultHttpClient();
client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);
HttpPost httpost = HttpClientConnectionManager.getPostMethod(url);
String prepay_id = “”;
try {
httpost.setEntity(new StringEntity(xmlParam, “UTF-8”));
HttpResponse response = httpclient.execute(httpost);
String jsonStr = EntityUtils.toString(response.getEntity(), “UTF-8”);
Map<String, Object> dataMap = new HashMap<String, Object>();

		if (jsonStr.indexOf("FAIL") != -1) {
			return prepay_id;
		}
		Map map = doXMLParse(jsonStr);
		String return_code = (String) map.get("return_code");
		prepay_id = (String) map.get("prepay_id");
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return prepay_id;
}

12.最后在把这些参数放到map集合中,返回到去
SortedMap<String, String> finalpackage = new TreeMap<String, String>();
//2
String timestamp = Sha1Util.getTimeStamp();
String nonceStr2 = nonce_str;
//4
String prepay_id2 = “prepay_id=” + prepay_id;
String packages = prepay_id2;

    log.info("packages="+packages);
    finalpackage.put("appId", wxSetting.getAppid());
    finalpackage.put("timeStamp", timestamp);
    finalpackage.put("nonceStr", nonceStr2);
    finalpackage.put("package", packages);
    //5
    finalpackage.put("signType", "MD5");
    //6
    String finalsign = reqHandler.createSign(finalpackage);

// System.out.println(finalsign);
finalpackage.put(“paySign”,finalsign);

    request.setAttribute("appId", wxSetting.getAppid());
    request.setAttribute("timeStamp", timestamp);
    request.setAttribute("nonceStr", nonceStr2);
    request.setAttribute("package", packages);
    request.setAttribute("signType", "MD5");
    request.setAttribute("paySign", finalsign);
    request.setAttribute("prepay_id", prepay_id);
    return finalpackage;
}

如有错误,欢迎指正。要源码加QQ549872907

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值