Java开发SSM框架微信支付
Java开发SSM框架微信支付
微信小程序的Java支付开发一直是一块坑,网上的教程也是琳琅满目。笔者六月的时候接触到了微信的小程序开发摸到了微信支付方面的东西,腾讯的官方文档也是一言难尽很多地方看不懂,而且官方也没有提供Java的示范导致Java做微信支付不得不自己踩坑。现在我把自己微信支付开发的步骤和代码都在下面展示出来,希望有没有做出来的朋友不要心急跟着我的步骤走就没问题。
第一步:首先微信支付的话只能是企业的开发账户才能使用的如果你是个人开发者是无法开通微信支付的。我们首先拿到账号,然后拿到微信支付相关的商户号和商户支付密钥,这些东西公司都会提供。有了这些以后就可以进行开发了。
public class Configure {
//商户支付密钥
private static String key = "****************************";
//小程序ID
private static String appID = "***************";
//商户号
private static String mch_id = "*********";
//小程序密钥
private static String secret = "********************";
我把开发者账号和商户号都放在了一个工具类方便在后面的调用。
第二步:做支付要先获取到用户的openid这是一个很重要的参数你必须要拿到的东西不然就无法完成支付。下面是我获取用户的openid的代码。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code = request.getParameter("code");
HttpGet httpGet = new HttpGet("https://api.weixin.qq.com/sns/jscode2session?appid="+Configure.getAppID()+"&secret="+Configure.getSecret()+"&js_code="+code+"&grant_type=authorization_code");
//设置请求器的配置
HttpClient httpClient = HttpClients.createDefault();
HttpResponse res = httpClient.execute(httpGet);
HttpEntity entity = res.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
response.getWriter().append(result);
}
第三步:获取到用户的openid之后我们就要进行下单。简单来说要把微信支付所需要的参数都准备好然后给到官方提供的api。这些东西在官方的文档里面各位可以去查阅。下面是我传递参数的代码:
String openid = request.getParameter("openid");
int totalFee=Integer.parseInt(request.getParameter("totalFee"));//获取支付金额
String out_trade_no=RandomStringGenerator.getRandomStringByLength(32);//商户订单号
OrderInfo order = new OrderInfo();
order.setAppid(Configure.getAppID());
order.setMch_id(Configure.getMch_id());
order.setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
order.setBody("测试");
order.setOut_trade_no(out_trade_no);
order.setTotal_fee(totalFee);
order.setSpbill_create_ip("***.***.***.**");
order.setNotify_url("https://www.see-source.com/weixinpay/PayResult");
order.setTrade_type("JSAPI");
order.setOpenid(openid);
order.setSign_type("MD5");
可以看到上面的传递的参数中有需要支付的金额、和随机生成的32位商户订单号、以及开发者的appid和支付说明支付的ip地址这些参数我们想办法都拿到之后是否就能丢给官方api呢?当然还不是,往下看第四步。
第四步:我们拿到了参数之后能否直接给到api呢?微信支付出于安全考虑参数需要进行加密之后发送给微信支付api。我们得把刚刚拿到的参数进行签名加密,我这里用到的是MD5的加密方式,代码如下:
try {
String repay_id = request.getParameter("repay_id");
SignInfo signInfo = new SignInfo();
signInfo.setAppId(Configure.getAppID());
long time = System.currentTimeMillis()/1000;
signInfo.setTimeStamp(String.valueOf(time));
signInfo.setNonceStr(RandomStringGenerator.getRandomStringByLength(32));
signInfo.setRepay_id("prepay_id="+repay_id);
signInfo.setSignType("MD5");
//生成签名
String sign = Signature.getSign(signInfo);
JSONObject json = new JSONObject();
json.put("timeStamp", signInfo.getTimeStamp());
json.put("nonceStr", signInfo.getNonceStr());
json.put("package", signInfo.getRepay_id());
json.put("signType", signInfo.getSignType());
json.put("paySign", sign);
L.info("-------再签名:"+json.toJSONString());
response.getWriter().append(json.toJSONString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
L.error("-------", e);
}
public static String getSign(Object o) throws IllegalAccessException {
ArrayList<String> list = new ArrayList<String>();
"rawtypes")
(
Class cls = o.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
if (f.get(o) != null && f.get(o) != "") {
String name = f.getName();
XStreamAlias anno = f.getAnnotation(XStreamAlias.class);
if(anno != null)
name = anno.value();
list.add(name + "=" + f.get(o) + "&");
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
}
String result = sb.toString();
result += "key=" + Configure.getKey();
System.out.println("签名数据:"+result);
result = MD5Util.MD5Encode(result,"utf-8").toUpperCase();
return result;
}
到这一步就已经支付完成了。
通过官方api返回的回调类型来判断支付是否成功。
只要大家按照步骤来就可以实现,有任何的问题欢迎在评论区指出。
源码下载:https://download.csdn.net/download/qq_37756682/10502284
原文地址https://blog.csdn.net/qq_37756682/article/details/82182448
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java源码 - ReentrantLock图解加锁过程
开篇 用图形化的方式加深加锁和解锁过程的解释性。 java源码 - ReentrantLockjava源码 - ReentrantLock之FairSyncjava源码 - ReentrantLock之NonfairSyncjava源码 - ReentrantLock图解加锁过程 加锁流程 1、首先我们分析非公平锁的的请求过程。我们假设在这个时候,还没有任务线程获取锁,这个时候,第一个线程过来了(我们使用的是非公平锁),那么第一个线程thread1会去获取锁. 这时它会调用下面的方法,通过CAS的操作,将当前AQS的state由0变成1,证明当前thread1已经获取到锁,并且将AQS的exclusiveOwnerThread设置成thread1,证明当前持有锁的线程是thread1。: final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } 2、此时来了第二个线程thread2,并且我们假设thread1还...
- 下一篇
Python版解决中文字符串错误
Python版解决中文字符串错误 在制作工具时使用到了中文字符,结果出现了错误。网上搜索了各种方法仍然无效,最后通过多次的debug和尝试才解决。为此写下来做为参考。 系统为Ubuntu1404,安装了Python 2.7.6和Python 3.4.3。具体的代码如下: name = "签名文件.png" print(name) 1 2 3 4 把该代码保存到code.py文件中,然后运行,出错的信息如下: $ python code.py File "code.py", line 2 SyntaxError: Non-ASCII character '\xe7' in file code.py on line 23, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 1 2 3 4 5 6 解决方法就是在文件开关加入以下声明: #coding=utf8 1 该声明告诉编译器源代码文件使用utf-8格式进行编码。 该方法的原理在于python2默认使用ASCII编码格式,...
相关文章
文章评论
共有0条评论来说两句吧...