小程序怎么开发调用微信支付及微信回调地址-亚博电竞手机版
开发技术
2022年05月19日 10:43
2
小程序怎么开发调用微信支付及微信回调地址
本篇内容主要讲解“小程序怎么开发调用微信支付及微信回调地址”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“小程序怎么开发调用微信支付及微信回调地址”吧!
首先观看微信提供的文档
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1
清楚调用微信支付必须传递的参数
因为微信提供了小程序唤起微信支付的方法,后端只需要传递对应的参数给前端即可
首先在程序中配置申请的固定参数
wx.open.app_id=用户的appidwx.open.app_secret=这是做登陆用的weixin.pay.partner=商户号wexxin.pay.partenerkey=商户号秘钥
编写工具类实现对固定值的读取
@component//@propertysource("classpath:application.properties")public class constantpropertiesutil implements initializingbean { //读取配置文件并赋值 @value("${wx.open.app_id}") private string appid; @value("${wx.open.app_secret}") private string appsecret; @value("{weixin.pay.partner}") private string partner; @value("{wexxin.pay.partenerkey}") private string partenerkey; public static string wx_open_app_id; public static string wx_open_app_secret; public static string partner; public static string partnerket; @override public void afterpropertiesset() throws exception { wx_open_app_id = appid; wx_open_app_secret = appsecret; partner = partner; partnerket = partenerkey; }}
当用户点击购买会生成订单,这里代码省略
点击登陆时调用后端传给前端需要的值
对应微信文档https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
可以看到,除了一些固定值,需要我们自己处理的有
签名:根据文档可以发现签名是有一定要求的
简单来说就将其他传入固定值字段进行排序拼接,在根据商家号的key进行加密处理。
支付接口
@autowired private wxservice wxservice; @getmapping("pay") public r creatnative(integer orderid){ try { map map = wxservice.payment(orderid); return r.ok().data(map); } catch (unsupportedencodingexception e) { return r.error().message("支付失败"); } }
编写service逻辑,根据文档进行传值
@servicepublic class wxserviceimpl implements wxservice { @autowired private orderservice orderservice; @override public map payment(integer orderid) throws unsupportedencodingexception { //封装传递微信地址参数 map parammap = new hashmap(); parammap.put("appid", constantpropertiesutil.wx_open_app_id); //公众号id parammap.put("mch_id", constantpropertiesutil.partner); //商户号 parammap.put("nonce_str", wxpayutil.generatenoncestr()); //随机字符串,调用工具类 parammap.put("out_trade_no", orderid); //订单流水号 order order = orderservice.getbyid(orderid); parammap.put("total_fee", order.getpayment()); //金额 parammap.put("spbill_create_ip", "127.0.0.1"); //终端ip parammap.put("notify_url", "http://xxxxx/weixin/callback");//回调地址 parammap.put("body",order.getproductname()); //商品名称 parammap.put("timestamp", wxutil.getcurrenttimestamp() "");//获取当前时间戳,单位秒 string sign = wxutil.gensignature(constantpropertiesutil.partnerket,parammap); //sing parammap.put("sign", sign); //签名 return parammap; }}
签名工具类,以及时间戳方法
public class wxutil { public static string gensignature(string secretkey, mapparams) throws unsupportedencodingexception { if (secretkey == null || params == null || params.size() == 0) { return ""; } // 1. 参数名按照ascii码表升序排序 string[] keys = params.keyset().toarray(new string[0]); arrays.sort(keys); // 2. 按照排序拼接参数名与参数值 stringbuffer parambuffer = new stringbuffer(); for (string key : keys) { parambuffer.append("&" key).append(params.get(key) == null ? "" : "=" params.get(key)); } // 3. 将secretkey拼接到最后 parambuffer=parambuffer.append("&key=" secretkey); string pa =parambuffer.substring(1); // 4. md5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。 return digestutils.md5hex(pa.getbytes("utf-8")).touppercase(); } /** * 获取当前时间戳,单位秒 * @return */ public static long getcurrenttimestamp() { return system.currenttimemillis()/1000; } /** * 获取当前时间戳,单位毫秒 * @return */ public static long getcurrenttimestampms() { return system.currenttimemillis(); } }
此时即可完成支付,微信支付后,微信会给我们回调地址进行发送信息,由此我们可以判断支付状态以及获取微信支付返回的参数
回调接口
//回调接口 @requestmapping("callback") public string callback(httpservletrequest request, httpservletresponse response) throws exception{ system.out.println("接口已被调用"); servletinputstream inputstream = request.getinputstream(); string notifyxml = streamutils.inputstream2string(inputstream, "utf-8"); system.out.println(notifyxml); // 解析返回结果 mapnotifymap = wxpayutil.xmltomap(notifyxml); // 判断支付是否成功 if ("success".equals(notifymap.get("result_code"))) { //编写自己的实现逻辑 // 支付成功:给微信发送我已接收通知的响应 // 创建响应对象 map returnmap = new hashmap<>(); returnmap.put("return_code", "success"); returnmap.put("return_msg", "ok"); string returnxml = wxpayutil.maptoxml(returnmap); response.setcontenttype("text/xml"); system.out.println("支付成功"); return returnxml; } } // 创建响应对象:微信接收到校验失败的结果后,会反复的调用当前回调函数 map returnmap = new hashmap<>(); returnmap.put("return_code", "fail"); returnmap.put("return_msg", ""); string returnxml = wxpayutil.maptoxml(returnmap); response.setcontenttype("text/xml"); system.out.println("校验失败"); return returnxml; }
接收输入流转换工具类
public class streamutils { private static int _buffer_size = 1024; /** * inputstream流转换成string字符串 * @param instream inputstream流 * @param encoding 编码格式 * @return string字符串 */ public static string inputstream2string(inputstream instream, string encoding){ string result = null; bytearrayoutputstream outstream = null; try { if(instream != null){ outstream = new bytearrayoutputstream(); byte[] tempbytes = new byte[_buffer_size]; int count = -1; while((count = instream.read(tempbytes, 0, _buffer_size)) != -1){ outstream.write(tempbytes, 0, count); } tempbytes = null; outstream.flush(); result = new string(outstream.tobytearray(), encoding); outstream.close(); } } catch (exception e) { result = null; } finally { try { if(instream != null) { instream.close(); instream = null; } if(outstream != null) { outstream.close(); outstream = null; } } catch (ioexception e) { e.printstacktrace(); } } return result; }}
到此,相信大家对“小程序怎么开发调用微信支付及微信回调地址”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注亚博电竞手机版,继续学习!
展开全文