小程序怎么开发调用微信支付及微信回调地址(小程序,开发技术)

时间:2024-05-07 19:47:27 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

首先观看微信提供的文档

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")publicclassConstantPropertiesUtilimplementsInitializingBean{//读取配置文件并赋值@Value("${wx.open.app_id}")privateStringappId;@Value("${wx.open.app_secret}")privateStringappSecret;@Value("{weixin.pay.partner}")privateStringpartner;@Value("{wexxin.pay.partenerkey}")privateStringpartenerkey;publicstaticStringWX_OPEN_APP_ID;publicstaticStringWX_OPEN_APP_SECRET;publicstaticStringPARTNER;publicstaticStringPARTNERKET;@OverridepublicvoidafterPropertiesSet()throwsException{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进行加密处理。

支付接口

@AutowiredprivateWXServicewxService;@GetMapping("pay")publicRcreatNative(Integerorderid){try{Mapmap=wxService.payment(orderid);returnR.ok().data(map);}catch(UnsupportedEncodingExceptione){returnR.error().message("支付失败");}}

编写service逻辑,根据文档进行传值

@ServicepublicclassWXServiceImplimplementsWXService{@AutowiredprivateOrderServiceorderService;@OverridepublicMappayment(Integerorderid)throwsUnsupportedEncodingException{//封装传递微信地址参数MapparamMap=newHashMap();paramMap.put("appid",ConstantPropertiesUtil.WX_OPEN_APP_ID);//公众号idparamMap.put("mch_id",ConstantPropertiesUtil.PARTNER);//商户号paramMap.put("nonce_str",WXPayUtil.generateNonceStr());//随机字符串,调用工具类paramMap.put("out_trade_no",orderid);//订单流水号Orderorder=orderService.getById(orderid);paramMap.put("total_fee",order.getPayment());//金额paramMap.put("spbill_create_ip","127.0.0.1");//终端ipparamMap.put("notify_url","http://XXXXX/weixin/callBack");//回调地址paramMap.put("body",order.getProductname());//商品名称paramMap.put("timeStamp",WXUtil.getCurrentTimestamp()+"");//获取当前时间戳,单位秒Stringsign=WXUtil.genSignature(ConstantPropertiesUtil.PARTNERKET,paramMap);//singparamMap.put("sign",sign);//签名returnparamMap;}}

签名工具类,以及时间戳方法

publicclassWXUtil{publicstaticStringgenSignature(StringsecretKey,Map<String,String>params)throwsUnsupportedEncodingException{if(secretKey==null||params==null||params.size()==0){return"";}//1.参数名按照ASCII码表升序排序String[]keys=params.keySet().toArray(newString[0]);Arrays.sort(keys);//2.按照排序拼接参数名与参数值StringBufferparamBuffer=newStringBuffer();for(Stringkey:keys){paramBuffer.append("&"+key).append(params.get(key)==null?"":"="+params.get(key));}//3.将secretKey拼接到最后paramBuffer=paramBuffer.append("&key="+secretKey);Stringpa=paramBuffer.substring(1);//4.MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。returnDigestUtils.md5Hex(pa.getBytes("UTF-8")).toUpperCase();}/***获取当前时间戳,单位秒*@return*/publicstaticlonggetCurrentTimestamp(){returnSystem.currentTimeMillis()/1000;}/***获取当前时间戳,单位毫秒*@return*/publicstaticlonggetCurrentTimestampMs(){returnSystem.currentTimeMillis();}}

此时即可完成支付,微信支付后,微信会给我们回调地址进行发送信息,由此我们可以判断支付状态以及获取微信支付返回的参数

回调接口

//回调接口@RequestMapping("callBack")publicStringcallBack(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{System.out.println("接口已被调用");ServletInputStreaminputStream=request.getInputStream();StringnotifyXml=StreamUtils.inputStream2String(inputStream,"utf-8");System.out.println(notifyXml);//解析返回结果Map<String,String>notifyMap=WXPayUtil.xmlToMap(notifyXml);//判断支付是否成功if("SUCCESS".equals(notifyMap.get("result_code"))){//编写自己的实现逻辑//支付成功:给微信发送我已接收通知的响应//创建响应对象Map<String,String>returnMap=newHashMap<>();returnMap.put("return_code","SUCCESS");returnMap.put("return_msg","OK");StringreturnXml=WXPayUtil.mapToXml(returnMap);response.setContentType("text/xml");System.out.println("支付成功");returnreturnXml;}}//创建响应对象:微信接收到校验失败的结果后,会反复的调用当前回调函数Map<String,String>returnMap=newHashMap<>();returnMap.put("return_code","FAIL");returnMap.put("return_msg","");StringreturnXml=WXPayUtil.mapToXml(returnMap);response.setContentType("text/xml");System.out.println("校验失败");returnreturnXml;}

接收输入流转换工具类

publicclassStreamUtils{privatestaticint_buffer_size=1024;/***InputStream流转换成String字符串*@paraminStreamInputStream流*@paramencoding编码格式*@returnString字符串*/publicstaticStringinputStream2String(InputStreaminStream,Stringencoding){Stringresult=null;ByteArrayOutputStreamoutStream=null;try{if(inStream!=null){outStream=newByteArrayOutputStream();byte[]tempBytes=newbyte[_buffer_size];intcount=-1;while((count=inStream.read(tempBytes,0,_buffer_size))!=-1){outStream.write(tempBytes,0,count);}tempBytes=null;outStream.flush();result=newString(outStream.toByteArray(),encoding);outStream.close();}}catch(Exceptione){result=null;}finally{try{if(inStream!=null){inStream.close();inStream=null;}if(outStream!=null){outStream.close();outStream=null;}}catch(IOExceptione){e.printStackTrace();}}returnresult;}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:小程序怎么开发调用微信支付及微信回调地址的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:flutter怎么封装单选点击菜单工具栏组件下一篇:

11 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18