微信小程序> 微信小程序餐饮案例-微信小程序支付案例-微信小程序实例

微信小程序餐饮案例-微信小程序支付案例-微信小程序实例

浏览量:1949 时间: 来源:SoXiaTea
小程序支付说明

1.此案例用作小程序缴费的情况。过程为:先触发微信小程序支付后台得到预付款ID(prepare_id),然后小程序前台会自动弹出一个对应金额的支付窗口,然后用户输入正确密码,支付成功,触发用户的回调函数做业务操作。

2.更多分布式微服务课程关注:www.majiaxueyuan.com

3.得到微信的code。小程序和公众号都可以直接得到

AccessToken获取方法(顺便写的)BodyStringgetAccessToken(Stringcode){CloseableHttpClienthttpClient=HttpClients.createDefault();Stringurl="https://api.weixin.qq.com/sns/jscode2session?appid="+WxPayConfig.APP_ID+"&secret="+WxPayConfig.APP_SECRET+"&js_code="+code+"&grant_type=authorization_code";//创建一个GET对象try{HttpGetget=newHttpGet(url);//执行请求CloseableHttpResponseresponse=httpClient.execute(get);HttpEntityentity=response.getEntity();Stringstring=EntityUtils.toString(entity,"utf-8");System.out.println(string);returnnewBodyString().setSuccess(string);}catch(Exceptione){returnnewBodyString().setError("登录异常");}}微信支付配置文件publicclassWxPayConfig{//小程序appidpublicstaticfinalStringAPP_ID="";//APP——SecretpublicstaticfinalStringAPP_SECRET="";//微信支付的商户号publicstaticfinalStringMCH_ID="";//微信支付的商户秘钥publicstaticfinalStringKEY="";//支付成功后的服务器回调urlpublicstaticfinalStringnotify_url="";//签名方式,固定值publicstaticfinalStringSIGNTYPE="MD5";//交易类型,小程序支付的固定值为JSAPIpublicstaticfinalStringTRADETYPE="JSAPI";//微信统一下单接口地址publicstaticfinalStringpay_url="https://api.mch.weixin.qq.com/pay/unifiedorder";//微信直接转账到个人请求publicstaticfinalStringtransfor_url="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";publicstaticfinalStringSTATIC_NUM="a0A0b1B2c1C3d2D1e3E2f4F3g5G7h4H6i5Ij4J9k5K6l6Lm7M7n8N8o9Op0PqQrRsStTuUv9VwWxXy8YzZ";}预付款ID

4.微信支付分为两步,第一步可以理解为获得一个预付款ID

/***微信支付获取预付款信息返回给小程序唤起支付界面*@paramunique:系统订单号*@paramopenId:用户唯一OpenId*@paramtotleMoney:付款金额,字符串(单位:分)*@paramipAddr:IP地址*@return*/publicBodyStringwxPay(Stringunique,StringopenId,StringtotleMoney,StringipAddr){//付款金额try{//生成的随机字符串Stringnonce_str=getRandomStringByLength(32);//获取客户端的ip地址Stringspbill_create_ip=ipAddr;//商品名称Stringbody="码家学院永久会员会员充值";//组装参数,用户生成统一下单接口的签名MapString,StringpackageParams=newHashMapString,String();packageParams.put("appid",WxPayConfig.APP_ID);packageParams.put("body",body);packageParams.put("mch_id",WxPayConfig.MCH_ID);packageParams.put("nonce_str",nonce_str);packageParams.put("notify_url",WxPayConfig.notify_url);//支付成功后的回调地址packageParams.put("openid",openId);packageParams.put("out_trade_no",unique);//商户订单号packageParams.put("spbill_create_ip",spbill_create_ip);packageParams.put("total_fee",totleMoney);//支付金额,这边需要转成字符串类型,否则后面的签名会失败packageParams.put("trade_type",WxPayConfig.TRADETYPE);//支付方式Stringprestr=PayUtil.createLinkString(packageParams);////MD5运算生成签名,这里是第一次签名,用于调用统一下单接口Stringmysign=PayUtil.sign(prestr,WxPayConfig.KEY,"utf-8").toUpperCase();//拼接统一下单接口使用的xml数据,要将上一步生成的签名一起拼接进去Stringxml="xml"+"appid"+WxPayConfig.APP_ID+"/appid"+"body![CDATA["+body+"]]/body"+"mch_id"+WxPayConfig.MCH_ID+"/mch_id"+"nonce_str"+nonce_str+"/nonce_str"+"notify_url"+WxPayConfig.notify_url+"/notify_url"+"openid"+openId+"/openid"+"out_trade_no"+unique+"/out_trade_no"+"spbill_create_ip"+spbill_create_ip+"/spbill_create_ip"+"total_fee"+totleMoney+"/total_fee"+"trade_type"+WxPayConfig.TRADETYPE+"/trade_type"+"sign"+mysign+"/sign"+"/xml";System.out.println("调试模式_统一下单接口请求XML数据:"+xml);//调用统一下单接口,并接受返回的结果Stringresult=PayUtil.httpRequest(WxPayConfig.pay_url,"POST",xml);System.out.println("调试模式_统一下单接口返回XML数据:"+result);//将解析结果存储在HashMap中Mapmap=PayUtil.doXMLParse(result);//返回状态码Stringreturn_code=(String)map.get("return_code");//返回给小程序端需要的参数MapString,Objectresponse=newHashMapString,Object();if(return_code=="SUCCESS"||return_code.equals(return_code)){//返回的预付单信息Stringprepay_id=(String)map.get("prepay_id");response.put("nonceStr",nonce_str);response.put("package","prepay_id="+prepay_id);LongtimeStamp=System.currentTimeMillis()/1000;response.put("timeStamp",timeStamp+"");//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误//拼接签名需要的参数StringstringSignTemp="appId="+WxPayConfig.APP_ID+"&nonceStr="+nonce_str+"&package=prepay_id="+prepay_id+"&signType=MD5&timeStamp="+timeStamp;//再次签名,这个签名用于小程序端调用wx.requesetPayment方法StringpaySign=PayUtil.sign(stringSignTemp,WxPayConfig.KEY,"utf-8").toUpperCase();response.put("paySign",paySign);}response.put("appid",WxPayConfig.APP_ID);Stringjson=JSON.toJSONString(response);returnnewBodyString().setSuccess(json);}catch(Exceptione){e.printStackTrace();}returnnull;}随机字符串生成方法publicstaticStringgetRandomStringByLength(intlength){Stringbase="abcdefghijklmnopqrstuvwxyz0123456789";Randomrandom=newRandom();StringBuffersb=newStringBuffer();for(inti=0;ilength;i++){intnumber=random.nextInt(base.length());sb.append(base.charAt(number));}returnsb.toString();}异步回调函数

5.(用户处理我们自己系统中的逻辑)

publicvoidwxNotify(HttpServletRequestrequest,HttpServletResponseresponse){try{BufferedReaderbr=newBufferedReader(newInputStreamReader((ServletInputStream)request.getInputStream()));Stringline=null;StringBuildersb=newStringBuilder();while((line=br.readLine())!=null){sb.append(line);}br.close();//sb为微信返回的xmlStringnotityXml=sb.toString();StringresXml="";System.out.println("接收到的报文:"+notityXml);Mapmap=PayUtil.doXMLParse(notityXml);StringreturnCode=(String)map.get("return_code");if("SUCCESS".equals(returnCode)){//支付成功,需要根据订单号来判断此订单号在系统中是否已经被处理过了//这就是所说的幂等性的处理,避免我们的订单被交易多次//处理完成过后告诉微信处理成功,避免微信触发重试机制map.get("result_code");map.get("transaction_id");//告诉微信处理完成resXml="xml"+"return_code![CDATA[SUCCESS]]/return_code"+"return_msg![CDATA[OK]]/return_msg"+"/xml";}else{//告诉微信处理失败resXml="xml"+"return_code![CDATA[FAIL]]/return_code"+"return_msg![CDATA[报文为空]]/return_msg"+"/xml";}System.out.println("微信支付回调数据结束");BufferedOutputStreamout;out=newBufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();}catch(Exceptione){e.printStackTrace();}}

6.到这里小程序当中的微信支付就完成了,也是很简答的

版权声明

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

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

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