小程序怎么开发调用微信支付及微信回调地址
导读:本文共3893字符,通常情况下阅读需要13分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 首先观看微信提供的文档https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1清楚调用微信支付必须传递的参数因为微信提供了小程序唤起微信支付的方法,后端只需要传递对应的参数给前端即可首先在程序中配置申请的固定参数wx.open.app_id=用户的appidwx... ...
目录
(为您整理了一些要点),点击可以直达。首先观看微信提供的文档
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">
小程序怎么开发调用微信支付及微信回调地址的详细内容,希望对您有所帮助,信息来源于网络。