微信小程序> 微信小程序微信支付功能java代码-微信小程序实现微信支付功能-微信小程序支付代码

微信小程序微信支付功能java代码-微信小程序实现微信支付功能-微信小程序支付代码

浏览量:1641 时间: 来源:zzzgd_666
1.微信官方文档1.

微信支付开发api文档

2.初步流程2.

首先一个最简单的支付功能,大体分为三步

预支付,后台系统跟微信后台交互,给小程序返回参数统一下单小程序拿到参数进行预支付用户确认支付,//跟微信后台交互,这一步我们不需要管微信后台回调我们的后台系统的接口,处理我们自己的业务逻辑回调处理支付结果3.代码3.

这里用到了github上的一个依赖,相当于支付的工具包

dependencygroupIdcom.github.javen205/groupIdartifactIdIJPay/artifactIdversion1.1.3/version/dependency4.

这边从前端小程序传过来的参数有:orderId–我们系统这边的订单idopenId–小程序传过来的用户标识我们配置文件中配置的固定参数有:appid–小程序idmchId–商户号notify_url–支付成功以后回调的我们写的接口地址partnerKey–商户平台设置的密钥key

封装返回结果的vo对象AjaxJson/***$.ajax后需要接受的JSON**@author**/publicclassAjaxJsonimplementsSerializable{/****/privatestaticfinallongserialVersionUID1L;privatebooleansuccesstrue;//是否成功privateStringmsg"操作成功";//提示信息privateObjectobjnull;//其他信息privateConcurrentMapString,Objectattributes;//其他参数privateStringerrorCode;//错误码privateIntegertotalSize;//错误码getter...setter方法}控制层统一下单/***小程序微信支付的第一步,统一下单*@return*@authorzgd*@time2018年7月9日17:53:35*/@RequestMapping("/createUnifiedOrder")@ResponseBodypublicAjaxJsoncreateUnifiedOrder(HttpServletRequestrequest){AjaxJsonajnewAjaxJson();aj.setSuccess(false);StringorderIdrequest.getParameter("orderId");//接受参数(openid)Stringopenidrequest.getParameter("openid");if(StringUtils.isAnyBlank(orderId,openid)){aj.setMsg("支付失败,支付所需参数缺失");returnaj;}//这里调用service层根据订单id获取订单数据,这里省略不表MapString,StringmapBasicgetOrderInfoById(orderId);if(mapBasicnull){aj.setMsg("支付失败,暂时无法获取到您的订单数据,请稍后再试");returnaj;}Stringreturn_msg"统一订单失败";try{//支付金额**金额不能有小数点,单位是分!!**BigDecimalpricenewBigDecimal(mapBasic.get("payAmount").toString());BigDecimalbeishunewBigDecimal("100");BigDecimalpriceFeeprice.multiply(beishu);//商家订单号StringorderNomapBasic.get("orderNo").toString();//创建时间戳StringtimeStampLong.valueOf(System.currentTimeMillis()).toString();//生成32位随机数UUIDuuidUUID.randomUUID();StringnonceStruuid.toString().replaceAll("-","");//商品描述Stringbody"XX商城-支付订单";//创建hashmap(用户获得签名)SortedMapString,StringparaMapnewTreeMapString,String();//设置请求参数(小程序ID)paraMap.put("appid",appid);//设置请求参数(商户号)paraMap.put("mch_id",mchId);//设置请求参数(随机字符串)paraMap.put("nonce_str",nonceStr);//设置请求参数(商品描述)paraMap.put("body",body);//设置请求参数(商户订单号)paraMap.put("out_trade_no",orderNo);//设置请求参数(总金额)paraMap.put("total_fee",priceFee.toBigInteger().toString());//设置请求参数(终端IP)如果是springmvc,或者能获取到request的servlet,用下面这种paraMap.put("spbill_create_ip",request.getRemoteAddr());//设置请求参数(通知地址)paraMap.put("notify_url",notify_url);//设置请求参数(交易类型)paraMap.put("trade_type",String.valueOf(WxPayApi.TradeType.JSAPI));//设置请求参数(openid)(在接口文档中该参数是否必填项但是一定要注意如果交易类型设置成'JSAPI'则必须传入openid)paraMap.put("openid",openid);//MD5运算生成签名,这里是第一次签名,用于调用统一下单接口StringsignPaymentKit.createSign(paraMap,partnerKey);paraMap.put("sign",sign);//统一下单,向微信api发送数据logger.info("微信小程序统一下单发送的数据:"+paraMap.toString());StringxmlResultWxPayApi.pushOrder(false,paraMap);logger.info("微信小程序统一下单接受返回的结果:"+xmlResult);//转成xmlMapString,StringmapPaymentKit.xmlToMap(xmlResult);//返回状态码Stringreturn_code(String)map.get("return_code");return_msgreturn_msg+","+(String)map.get("return_msg");//返回给小程序端需要的参数MapString,StringreturnMapnewHashMapString,String();if(Constants.SUCCESS.equals(return_code)){//返回的预付单信息returnMap.put("appId",appid);returnMap.put("nonceStr",nonceStr);Stringprepay_id(String)map.get("prepay_id");returnMap.put("package","prepay_id"+prepay_id);returnMap.put("signType","MD5");//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误returnMap.put("timeStamp",timeStamp);//拼接签名需要的参数//再次签名,这个签名用于小程序端调用wx.requesetPayment方法StringpaySignPaymentKit.createSign(returnMap,partnerKey).toUpperCase();returnMap.put("paySign",paySign);aj.setObj(returnMap);aj.setMsg("操作成功");aj.setSuccess(true);returnaj;}else{aj.setMsg(getMsgByCode(return_code));logger.error(Thread.currentThread().getStackTrace()[1].getMethodName()+""+return_msg);}}catch(Exceptione){logger.error(Thread.currentThread().getStackTrace()[1].getMethodName()+"发生的异常是:",e);aj.setMsg("微信支付下单失败,请稍后再试");}returnaj;}5.

getMsgByCode

/***判断返回的return_code,给前端相应的提示*@paramreturn_code*@return*@authorzgd*@time2018年7月9日17:53:13*/privateStringgetMsgByCode(Stringreturn_code){switch(return_code){case"NOTENOUGH":return"您的账户余额不足";case"ORDERPAID":return"该订单已支付完成,请勿重复支付";case"ORDERCLOSED":return"当前订单已关闭,请重新下单";case"SYSTEMERROR":return"系统超时,请重新支付";case"OUT_TRADE_NO_USED":return"请勿重复提交该订单";default:return"网络正在开小差,请稍后再试";}}2.回调6.

比如上面配置的notify_url是http://系统的ip和端口/wxPay/notify

@RequestMapping("/wxPay")publicclassWxPayController{privateStringpaternerKey"XXXXXX";@RequestMapping("/notify")publicvoidnotify(HttpServletRequestrequest){//获取所有的参数StringBuffersbfnewStringBuffer();//支付结果通用通知文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter9_7StringxmlMsgHttpKit.readData(request);System.out.println("支付通知"+xmlMsg);MapString,StringparamsPaymentKit.xmlToMap(xmlMsg);Stringresult_codeparams.get("result_code");//校验返回来的支付结果,根据已经配置的密钥if(PaymentKit.verifyNotify(params,paternerKey)){//Constants.SUCCESS"SUCCESS"if((Constants.SUCCESS).equals(result_code)){校验通过.更改订单状态为已支付,修改库存}}}}7.

拼接参数为字符串的工具方法

publicstaticStringreadData(HttpServletRequestrequest){BufferedReaderbrnull;try{StringBuilderret;brrequest.getReader();Stringlinebr.readLine();if(line!null){retnewStringBuilder();ret.append(line);}else{return"";}while((linebr.readLine())!null){ret.append('').append(line);}returnret.toString();}catch(IOExceptione){thrownewRuntimeException(e);}finally{if(br!null){try{br.close();}catch(IOExceptione){LogKit.error(e.getMessage(),e);}}}}

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎