- 微信小程序进行支付时提示支付验证失败,如何解决?
在支付时提示支付签名验证失败,这个如何解决? 后端是springboot,代码如下 Map<String, Object> params = new HashMap<>(8); params.put("appid", wechatPayConfig.getAppId()); params.put("mchid", wechatPayConfig.getMerchantId()); params.put("description", "充值信息"); int outTradeNo = new Random().nextInt(999999999); params.put("out_trade_no", outTradeNo+""); params.put("notify_url", wechatPayConfig.getNotifyOrderUrl()); Map<String, Object> amountMap = new HashMap<>(4); // 金额单位为分 amountMap.put("total", 1); amountMap.put("currency", "CNY"); params.put("amount", amountMap); // 场景信息 Map<String, Object> sceneInfoMap = new HashMap<>(4); // 客户端IP sceneInfoMap.put("payer_client_ip", "127.0.0.1"); // 商户端设备号(门店号或收银设备ID) sceneInfoMap.put("device_id", "127.0.0.1"); // 除H5与JSAPI有特殊参数外,其他的支付方式都一样 if (weChatPayVO.getType().equals(WechatPayUrlEnum.H5.getType())) { Map<String, Object> h5InfoMap = new HashMap<>(4); // 场景类型:iOS, Android, Wap h5InfoMap.put("type", "IOS"); sceneInfoMap.put("h5_info", h5InfoMap); } else if (weChatPayVO.getType().equals(WechatPayUrlEnum.JSAPI.getType()) || weChatPayVO.getType().equals(WechatPayUrlEnum.SUB_JSAPI.getType())) { Map<String, Object> payerMap = new HashMap<>(4); payerMap.put("openid", weChatPayVO.getOpenid()); params.put("payer", payerMap); } params.put("scene_info", sceneInfoMap); String paramsStr = JSON.toJSONString(params); log.info("请求参数 ===> {}" + paramsStr); // 重写type值,因为小程序会多一个下划线(sub_type) String[] split = weChatPayVO.getType().split("_"); String newType = split[split.length - 1]; String resStr = wechatPayRequest.wechatHttpPost(wechatPayConfig.getBaseUrl().concat(WechatPayUrlEnum.PAY_TRANSACTIONS.getType().concat(newType)), paramsStr); Map<String, Object> resMap = JSONObject.parseObject(resStr, new TypeReference<Map<String, Object>>(){}); Map<String, Object> signMap = paySignMsg(resMap, weChatPayVO.getType()); resMap.put("type",weChatPayVO.getType()); resMap.put("signMap",signMap); return new ResultUtils(resMap); MD5加密如下 /** * 获取加密数据 */ private String createSign(Map<String, Object> params){ try { Map<String, Object> treeMap = new TreeMap<>(params); List<String> signList = new ArrayList<>(5); for (Map.Entry<String, Object> entry : treeMap.entrySet()) { signList.add(entry.getKey() + "=" + entry.getValue()); } String signStr = String.join("&", signList); signStr = signStr+"&key="+wechatPayConfig.getV3Key(); System.out.println(signStr); Mac sha = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKey = new SecretKeySpec(wechatPayConfig.getV3Key().getBytes(StandardCharsets.UTF_8), "HmacSHA256"); sha.init(secretKey); byte[] array = sha.doFinal(signStr.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte item : array) { sb.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3); } signStr = sb.toString().toUpperCase(); System.out.println(signStr); return signStr; }catch (Exception e){ throw new RuntimeException("加密失败!"); } } 签名认证如下 // 设置签名信息,Native与H5不需要 if(type.equals(WechatPayUrlEnum.H5.getType()) || type.equals(WechatPayUrlEnum.NATIVE.getType()) ){ return null; } long timeMillis = System.currentTimeMillis(); String appId = wechatPayConfig.getAppId(); String timeStamp = timeMillis/1000+""; String nonceStr = timeMillis+""; String prepayId = map.get("prepay_id").toString(); String packageStr = "prepay_id="+prepayId; // 公共参数 Map<String, Object> resMap = new HashMap<>(); resMap.put("nonceStr",nonceStr); resMap.put("timeStamp",timeStamp); // JSAPI、SUB_JSAPI(小程序) if(type.equals(WechatPayUrlEnum.JSAPI.getType()) || type.equals(WechatPayUrlEnum.SUB_JSAPI.getType()) ) { resMap.put("appId",appId); resMap.put("package", packageStr); // 使用字段appId、timeStamp、nonceStr、package进行签名 String paySign = createSign(resMap); resMap.put("paySign", paySign); resMap.put("signType", "RSA"); } // APP if(type.equals(WechatPayUrlEnum.APP.getType())) { resMap.put("appid",appId); resMap.put("prepayid", prepayId); // 使用字段appId、timeStamp、nonceStr、prepayId进行签名 String sign = createSign(resMap); resMap.put("package", "Sign=WXPay"); resMap.put("partnerid", wechatPayConfig.getMerchantId()); resMap.put("sign", sign); resMap.put("signType", "HMAC-SHA256"); } return resMap;
2022-08-25 - 使用image无法显示微信头像,如何解决?
<button class="avatar-wrapper" open-type="chooseAvatar" @chooseavatar="onChooseAvatar"> <image src="../../static/image/left.png" class="to-left-image1"></image> <image :src="userInfo.avatarUrl" class="avatar-image"></image> </button> 使用@chooseavatar获取头像后,当时可以显示头像,但是随即清楚缓存后无法显示头像,头像url没有问题 [图片] 如图所示,这个头像无法显示,将url放到浏览器中也无法显示,开发者工具无法显示,真机调试也无法显示。
2022-08-23 - 在开发者工具中显示没问题,但是在真机调试时部分图标无法显示,怎么解决?
开发者使用的版本号是1.06.2208010 开发时在开发者工具中没有问题,但是在真机调试时,部分图片无法显示,都是本地的图片,使用时用的是相对路径。这个如何解决
2022-08-12 - 在支付时提示支付签证验证失败,这是哪里的问题?
使用v3密钥,统一下单没问题,在拉起支付时提示支付签名验证失败,微信官方校验工具检验签名是通过的, [图片] 但是在真机调试时是报支付签名验证失败。这是什么原因呢?
2022-07-21 - 扫码进入小程序需要携带参数,在提交审核时需要提供什么信息吗?
使用场景:使用人员通过扫码进入小程序,这个小程序码需要携带一个序列号,再提交审核时,是需要将这个小程序码提供给审核人员,还是只提供序列号就可以 如果需要提供小程序码的话,现在小程序未上线,好像是无法生成小程序码,
2021-10-18 - 小程序码在生成时,是否可以在接口中限制扫描次数和过期时间?
生成小程序码后,可与在小程序后台设置扫描次数和过期时间码
2021-09-29 - 如何在生成小程序码中设置限制扫描次数和禁止分享或者转发?
场景:在小程序码中携带四个参数,这个小程序只能被扫描四次,而且不能被分享和转发,如何实现
2021-09-27 - 使用wx.openDocument()打开pdf文件,手机总是文档错误
使用FileSystemManager.writeFile写入文件,然后使用openDocument()读取文件,在pc端上没有问题,pc端版本是3.3.5.34,在手机端和微信开发者工具上不能打开,总是报文档错误,但是返回的是ok,微信开发者工具使用的调试基础库是2.19.1,手机微信版本是8.0.10[图片] [图片][图片][图片] [图片]
2021-08-20 - 如何解决手机使用wx.openDocument打开pdf文件报文档错误?
使用wx.openDocument时在电脑端微信上没有问题,在手机端和微信开发工具上报文档错误,返回值是ok,但是文档就是大不开这是什么问题?[图片][图片]
2021-08-20