微信小程序对接微信支付功能一、业务流程时序图二、小程序下单,请求下单支付三、java调用小程序登录API四、java调用支付统一下单API五、小程序调用支付API5.1参数说明5.2小程序代码六、接口参数配置查询七、生成签名的类(完整类)参考链接一、业务流程时序图1.地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter7_4index3
二、小程序下单,请求下单支付微信小程序调用wx.login()获取临时登录凭证code,通过接口传递到服务端项目中服务端项目通过code获取到openIdwx.login({success(res){if(res.code){console.log(res.code);varparamsData{"openId":"oByE41RshRjl5n73q-dKWBPpwkj1I","payType":"3","rechargeMoney":"0.01","userId":"c3994721bca3459c97736a67ab29c526","code":res.code}console.log("临时登录凭证code"+code)//调用后端的接口wx.request({url:"https://majkerTest.com:8081/wsXm/m/recharge",method:"post",data:paramsData,header:{'content-type':'application/json',"Authorization":token},success:function(res){console.log("后端返回的5个参数为"+res.data.data);//小程序调用支付startwx.requestPayment({timeStamp:res.data.data.timeStamp,nonceStr:res.data.data.nonceStr,package:res.data.data.package,signType:res.data.data.signType,paySign:res.data.data.paySign,'success':function(res){console.log(res);},'fail':function(res){console.log(res);},'complete':function(res){console.log(res);}})///小程序调用支付end}})}else{console.log('登录失败!'+res.errMsg)}}})三、java调用小程序登录API/***根据临时登录凭证获取openId*@authormajker*@paramcode临时登录凭证*@returnopenId*/publicStringgetOpenIdByCode(Stringcode){logger.info("获取code成功!{}",code);//登录凭证校验//文档:https://developers.weixin.qq.com/miniprogram/dev/api/code2Session.htmlStringurl"https://api.weixin.qq.com/sns/jscode2session?appid"+WxProgramPayConfig.APPID+"secret"+WxProgramPayConfig.SECRET+"js_code"+code+"grant_typeauthorization_code";//发送请求给微信后端CloseableHttpClienthttpClientHttpClients.createDefault();HttpGethttpGetnewHttpGet(url);InputStreaminputStreamnull;CloseableHttpResponsehttpResponsenull;StringBuilderresultnewStringBuilder();StringopenIdnull;try{httpResponsehttpClient.execute(httpGet);HttpEntityentityhttpResponse.getEntity();inputStreamentity.getContent();BufferedReaderbufferedReadernewBufferedReader(newInputStreamReader(inputStream));Stringline"";while((linebufferedReader.readLine())!null){//这里需要使用fastjson来提取一下内容System.out.println(line);JSONObjectjsonObjectJSON.parseObject(line);openIdjsonObject.getString("openid");StringsessionKeyjsonObject.getString("session_key");logger.info("openId{},sessionKey{}",openId,sessionKey);}}catch(IOExceptione){logger.error("获取openId失败"+e.getMessage());}returnopenId;}四、java调用支付统一下单API2.统一下单API:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter9_1
/***功能描述:微信小程序支付**@paramoutTradeNo商户订单号*@parammoney订单总金额(元)*@paramopenid微信用户的openId*@return*@auther:majker*@date:2019/3/5*@throwsException*/publicObjectgenWxProgramPayChannel(StringoutTradeNo,BigDecimalmoney,Stringopenid,Stringtype)throwsException{MapString,StringreqParamsnewHashMap();//微信分配的小程序IDreqParams.put("appid",WxProgramPayConfig.APPID);//微信支付分配的商户号reqParams.put("mch_id",WxProgramPayConfig.MCH_ID);//随机字符串reqParams.put("nonce_str",System.currentTimeMillis()/1000+"");//签名类型reqParams.put("sign_type","MD5");//充值订单商品描述reqParams.put("body",Global.getConfig("projectName")+"-充值订单-微信小程序");//商户订单号reqParams.put("out_trade_no",outTradeNo);//订单总金额,单位为分reqParams.put("total_fee",money.multiply(BigDecimal.valueOf(100)).intValue()+"");//终端IPreqParams.put("spbill_create_ip","127.0.0.1");//通知地址reqParams.put("notify_url",WxProgramPayConfig.NOTIFY_URL);//交易类型reqParams.put("trade_type","JSAPI");//用户标识reqParams.put("openid",openid);//签名StringsignWXPayUtil.generateSignature(reqParams,WxProgramPayConfig.KEY);reqParams.put("sign",sign);/*调用支付定义下单API,返回预付单信息prepay_id*/StringxmlResultPaymentApi.pushOrder(reqParams);logger.info(xmlResult);MapString,StringresultPaymentKit.xmlToMap(xmlResult);//预付单信息Stringprepay_idresult.get("prepay_id");/*小程序调起支付数据签名*/MapString,StringpackageParamsnewHashMapString,String();packageParams.put("appId",WxProgramPayConfig.APPID);packageParams.put("timeStamp",System.currentTimeMillis()/1000+"");packageParams.put("nonceStr",System.currentTimeMillis()+"");packageParams.put("package","prepay_id"+prepay_id);packageParams.put("signType","MD5");StringpackageSignWXPayUtil.generateSignature(packageParams,WxProgramPayConfig.KEY);packageParams.put("paySign",packageSign);returnpackageParams;}五、小程序调用支付API3.小程序调起支付API:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter7_7index5
5.1参数说明5.2小程序代码wx.requestPayment({timeStamp:res.data.data.timeStamp,nonceStr:res.data.data.nonceStr,package:res.data.data.package,signType:res.data.data.signType,paySign:res.data.data.paySign,'success':function(res){console.log(res);},'fail':function(res){console.log(res);},'complete':function(res){console.log(res);}})六、接口参数配置查询4.邮件中的账户参数与接口API参数对应关系见如下表格https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter3_1
七、生成签名的类(完整类)importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.w3c.dom.Node;importorg.w3c.dom.NodeList;importjava.io.ByteArrayInputStream;importjava.io.InputStream;importjava.io.StringWriter;importjava.security.MessageDigest;importjava.util.Arrays;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;importjava.util.UUID;importjavax.crypto.Mac;importjavax.crypto.spec.SecretKeySpec;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.transform.OutputKeys;importjavax.xml.transform.Transformer;importjavax.xml.transform.TransformerFactory;importjavax.xml.transform.dom.DOMSource;importjavax.xml.transform.stream.StreamResult;publicclassWXPayUtil{/***XML格式字符串转换为Map**@paramstrXMLXML字符串*@returnXML数据转换后的Map*@throwsException*/publicstaticMapString,StringxmlToMap(StringstrXML)throwsException{try{MapString,StringdatanewHashMapString,String();DocumentBuilderFactorydocumentBuilderFactoryDocumentBuilderFactory.newInstance();DocumentBuilderdocumentBuilderdocumentBuilderFactory.newDocumentBuilder();InputStreamstreamnewByteArrayInputStream(strXML.getBytes("UTF-8"));org.w3c.dom.DocumentdocdocumentBuilder.parse(stream);doc.getDocumentElement().normalize();NodeListnodeListdoc.getDocumentElement().getChildNodes();for(intidx0;idxnodeList.getLength();++idx){NodenodenodeList.item(idx);if(node.getNodeType()Node.ELEMENT_NODE){org.w3c.dom.Elementelement(org.w3c.dom.Element)node;data.put(element.getNodeName(),element.getTextContent());}}try{stream.close();}catch(Exceptionex){//donothing}returndata;}catch(Exceptionex){WXPayUtil.getLogger().warn("InvalidXML,cannotconverttomap.Errormessage:{}.XMLcontent:{}",ex.getMessage(),strXML);throwex;}}/***将Map转换为XML格式的字符串**@paramdataMap类型数据*@returnXML格式的字符串*@throwsException*/publicstaticStringmapToXml(MapString,Stringdata)throwsException{DocumentBuilderFactorydocumentBuilderFactoryDocumentBuilderFactory.newInstance();DocumentBuilderdocumentBuilderdocumentBuilderFactory.newDocumentBuilder();org.w3c.dom.DocumentdocumentdocumentBuilder.newDocument();org.w3c.dom.Elementrootdocument.createElement("xml");document.appendChild(root);for(Stringkey:data.keySet()){Stringvaluedata.get(key);if(valuenull){value"";}valuevalue.trim();org.w3c.dom.Elementfileddocument.createElement(key);filed.appendChild(document.createTextNode(value));root.appendChild(filed);}TransformerFactorytfTransformerFactory.newInstance();Transformertransformertf.newTransformer();DOMSourcesourcenewDOMSource(document);transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");transformer.setOutputProperty(OutputKeys.INDENT,"yes");StringWriterwriternewStringWriter();StreamResultresultnewStreamResult(writer);transformer.transform(source,result);Stringoutputwriter.getBuffer().toString();//.replaceAll("|r","");try{writer.close();}catch(Exceptionex){}returnoutput;}/***生成带有sign的XML格式字符串**@paramdataMap类型数据*@paramkeyAPI密钥*@return含有sign字段的XML*/publicstaticStringgenerateSignedXml(finalMapString,Stringdata,Stringkey)throwsException{returngenerateSignedXml(data,key,WXPayConstants.SignType.MD5);}/***生成带有sign的XML格式字符串**@paramdataMap类型数据*@paramkeyAPI密钥*@paramsignType签名类型*@return含有sign字段的XML*/publicstaticStringgenerateSignedXml(finalMapString,Stringdata,Stringkey,WXPayConstants.SignTypesignType)throwsException{StringsigngenerateSignature(data,key,signType);data.put(WXPayConstants.FIELD_SIGN,sign);returnmapToXml(data);}/***判断签名是否正确**@paramxmlStrXML格式数据*@paramkeyAPI密钥*@return签名是否正确*@throwsException*/publicstaticbooleanisSignatureValid(StringxmlStr,Stringkey)throwsException{MapString,StringdataxmlToMap(xmlStr);if(!data.containsKey(WXPayConstants.FIELD_SIGN)){returnfalse;}Stringsigndata.get(WXPayConstants.FIELD_SIGN);returngenerateSignature(data,key).equals(sign);}/***判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。**@paramdataMap类型数据*@paramkeyAPI密钥*@return签名是否正确*@throwsException*/publicstaticbooleanisSignatureValid(MapString,Stringdata,Stringkey)throwsException{returnisSignatureValid(data,key,WXPayConstants.SignType.MD5);}/***判断签名是否正确,必须包含sign字段,否则返回false。**@paramdataMap类型数据*@paramkeyAPI密钥*@paramsignType签名方式*@return签名是否正确*@throwsException*/publicstaticbooleanisSignatureValid(MapString,Stringdata,Stringkey,WXPayConstants.SignTypesignType)throwsException{if(!data.containsKey(WXPayConstants.FIELD_SIGN)){returnfalse;}Stringsigndata.get(WXPayConstants.FIELD_SIGN);returngenerateSignature(data,key,signType).equals(sign);}/***生成签名**@paramdata待签名数据*@paramkeyAPI密钥*@return签名*/publicstaticStringgenerateSignature(finalMapString,Stringdata,Stringkey)throwsException{returngenerateSignature(data,key,WXPayConstants.SignType.MD5);}/***生成签名.注意,若含有sign_type字段,必须和signType参数保持一致。**@paramdata待签名数据*@paramkeyAPI密钥*@paramsignType签名方式*@return签名*/publicstaticStringgenerateSignature(finalMapString,Stringdata,Stringkey,WXPayConstants.SignTypesignType)throwsException{SetStringkeySetdata.keySet();String[]keyArraykeySet.toArray(newString[keySet.size()]);Arrays.sort(keyArray);StringBuildersbnewStringBuilder();for(Stringk:keyArray){if(k.equals(WXPayConstants.FIELD_SIGN)){continue;}if(data.get(k).trim().length()0)//参数值为空,则不参与签名sb.append(k).append("").append(data.get(k).trim()).append("");}sb.append("key").append(key);if(WXPayConstants.SignType.MD5.equals(signType)){returnMD5(sb.toString()).toUpperCase();}elseif(WXPayConstants.SignType.HMACSHA256.equals(signType)){returnHMACSHA256(sb.toString(),key);}else{thrownewException(String.format("Invalidsign_type:%s",signType));}}/***获取随机字符串NonceStr**@returnString随机字符串*/publicstaticStringgenerateNonceStr(){returnUUID.randomUUID().toString().replaceAll("-","").substring(0,32);}/***生成MD5**@paramdata待处理数据*@returnMD5结果*/publicstaticStringMD5(Stringdata)throwsException{MessageDigestmdMessageDigest.getInstance("MD5");byte[]arraymd.digest(data.getBytes("UTF-8"));StringBuildersbnewStringBuilder();for(byteitem:array){sb.append(Integer.toHexString((item0xFF)|0x100).substring(1,3));}returnsb.toString().toUpperCase();}/***生成HMACSHA256*@paramdata待处理数据*@paramkey密钥*@return加密结果*@throwsException*/publicstaticStringHMACSHA256(Stringdata,Stringkey)throwsException{Macsha256_HMACMac.getInstance("HmacSHA256");SecretKeySpecsecret_keynewSecretKeySpec(key.getBytes("UTF-8"),"HmacSHA256");sha256_HMAC.init(secret_key);byte[]arraysha256_HMAC.doFinal(data.getBytes("UTF-8"));StringBuildersbnewStringBuilder();for(byteitem:array){sb.append(Integer.toHexString((item0xFF)|0x100).substring(1,3));}returnsb.toString().toUpperCase();}/***日志*@return*/publicstaticLoggergetLogger(){LoggerloggerLoggerFactory.getLogger("wxpayjavasdk");returnlogger;}/***获取当前时间戳,单位秒*@return*/publicstaticlonggetCurrentTimestamp(){returnSystem.currentTimeMillis()/1000;}/***获取当前时间戳,单位毫秒*@return*/publicstaticlonggetCurrentTimestampMs(){returnSystem.currentTimeMillis();}/***生成uuid,即用来标识一笔单,也用做nonce_str*@return*/publicstaticStringgenerateUUID(){returnUUID.randomUUID().toString().replaceAll("-","").substring(0,32);}}参考链接名称链接微信小程序下订单https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter9_1小程序调取支付APIhttps://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter7_7index5HTTPS服务器配置https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter10_4小程序API文档https://developers.weixin.qq.com/miniprogram/dev/
微信小程序对接微信支付功能-微信小程序实现微信支付功能-微信小程序支付代码
浏览量:1803
时间:
来源:我是周小福
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。











