Java 后端微信小程序支付

一、遇到的问题

1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试

2.签名错误

3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候出现 支付验证签名失败

网上的问题基本上就是这三类下面说解决方案。

第一个问题:商户号的问题,微信app支付与微信小程序支付的商户号不同,微信app内支付与微信开放平台内的商户号绑定,微信小程序支付是与微信公众平台内的商户号绑定。

第二个问题:签名错误, 第一次签名需要的appid mchid key 分别对应的是小程序的appid、微信公众平台绑定的商户号、以及商户平台的密钥(重要的事情说三遍:商户平台的!商户平台的!商户平台的!)。

这里重点说下商户平台的密钥(当时就是因为密钥的问题耽误了不少时间):具体请看图(商户平台--->账户中心--->API安全---->设置密钥)

第三个问题:支付验证签名失败 这个就得需要严格执行小程序支付文档中的生成签名的规则。参数字段大小写、顺序一定要对(切记,切记,切记)

如果能把以上都注意到了,那基本上没什么问题了。下面是我自己写的demo供大家参考,有什么问题可以留言。

二、demo 事例

1.下载商户的证书(在问题2的截图中已经展示下载的位置)放在resources下的cert目录下(cert目录需要自己手动建)

2.实现微信的 WXPayConfig接口

 package com.ieou.franky.payCenter.common;

 import com.github.wxpay.sdk.WXPayConfig;
import org.apache.commons.io.IOUtils; import java.io.ByteArrayInputStream;
import java.io.InputStream; public class MiniprogramConfig implements WXPayConfig{ private byte[] certData; public MiniprogramConfig() throws Exception {
InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/miniProgram/apiclient_cert.p12");
this.certData = IOUtils.toByteArray(certStream);
certStream.close();
} @Override
public String getAppID() {
return "wx6db448a73f8a6666";
} //小程序appid @Override
public String getMchID() {
return "1500669999";
} //商户号 /** 商户平台-账户中心-API安全中的密钥 */
@Override
public String getKey() {
return "1add1a30ac87aa77yyy2db72f57a237577777";
} @Override
public InputStream getCertStream() {
return new ByteArrayInputStream(this.certData);
} @Override
public int getHttpConnectTimeoutMs() {
return 0;
} @Override
public int getHttpReadTimeoutMs() {
return 0;
}
}

3.调用微信统一下单接口并且实现签名

 private Map<String, String> createMiniProgramTradePay(WxpayTradeAppPayModel model,String notifyUrl) throws Exception {
MiniprogramConfig config = new MiniprogramConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<>();
data.put("appid",config.getAppID());
data.put("mch_id",config.getMchID());
data.put("body",model.getBody());
data.put("out_trade_no", model.getOutTradeNo());
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", model.getTotalFee());
data.put("spbill_create_ip", "127.0.0.1");
data.put("notify_url", notifyUrl);
data.put("trade_type", "JSAPI");
data.put("openid",model.getOpenId());
// data.put("nonce_str","1add1a30ac87aa2db72f57a2375d8fec");
String sign = WXPayUtil.generateSignature(data, config.getKey());
data.put("sign",sign); Map<String, String> resp = wxpay.unifiedOrder(data);
if ("SUCCESS".equals(resp.get("return_code"))) {
//再次签名
/** 重要的事情说三遍 小程序支付 所有的字段必须大写 驼峰模式 严格按照小程序支付文档
*https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3#
* ******* 我当初就因为timeStamp中S没大写弄了3个小时 **********
* */
Map<String, String> reData = new HashMap<>();
reData.put("appId", config.getAppID());
reData.put("nonceStr", resp.get("nonce_str"));
String newPackage = "prepay_id=" + resp.get("prepay_id");
reData.put("package", newPackage);
reData.put("signType","MD5");
reData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); String newSign = WXPayUtil.generateSignature(reData, config.getKey());
resp.put("paySign",newSign);
resp.put("timeStamp", reData.get("timeStamp"));
return resp;
} else {
throw new FrankyErrorException(resp.get("return_msg"));
} }

说明:这里只是说明小程序支付与微信app内支付的不同和遇到的问题,有关里面用到微信的SDK,请看上一篇文章。

到这一步java 后端代码就差不多了,前端拿到返回的字段调起支付接口。

Java 后端微信小程序支付demo (网上说的坑里面基本上都有)的更多相关文章

  1. Java实现微信小程序支付(准备)

    Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...

  2. Java实现微信小程序支付(完整版)

    在开发微信小程序支付的功能前,我们先熟悉下微信小程序支付的业务流程图: 不熟悉流程的建议还是仔细阅读微信官方的开发者文档. 一,准备工作 事先需要申请企业版小程序,并开通“微信支付”(即商户功能).并 ...

  3. 微信小程序支付最容易犯的坑notify_url(支付回调)

    最近做了微信小程序支付,支付成功之后发现notify_url回调地址竟然没有访问. 检查了无数次代码,下单结果里面的回调地址看了又看,都没有错啊. 把回调地址复制出来到浏览器上面,外网也是可以访问的啊 ...

  4. Java实现微信小程序支付(支付,提现,退款)

    1.添加WXpayCommon类用以具体实现功能,代码如下: package com.karat.cn.wxCommon; import java.io.IOException; import jav ...

  5. 微信小程序支付 java

    原文:https://blog.csdn.net/zhourenfei17/article/details/77765585 话不多说,直接开撸. 支付流程步骤: 1)首先调用wx.login方法获取 ...

  6. 微信小程序支付C#后端源码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  7. 【原创】微信小程序支付java后台案例(公众号支付同适用)(签名错误问题)

    前言 1.微信小程序支付官方接口文档:[点击查看微信开放平台api开发文档]2.遇到的坑:预支付统一下单签名结果返回[签名错误]失败,建议用官方[签名验证工具]检查签名是否存在问题.3.遇到的坑:签名 ...

  8. 微信小程序支付开发之申请退款

    微信小程序支付跟微信公众号支付类似,这里不另做记录,如果没有开发过支付,可以查看我关于微信支付的文章 重点记录微信小程序申请退款开发过程中遇到一些坑. 退款接口比支付接口接口多了一个 双向证书 证书介 ...

  9. 微信小程序支付接入实战

    1. 微信小程序支付接入实战 1.1. 需求   最近接到一个小程序微信支付的需求,需要我写后台支持,本着能不自己写就不自己写的cv原则,在网上找到了些第三方程序,经过尝试后,最后决定了这不要脸作者的 ...

随机推荐

  1. 【BZOJ2555】SubString(后缀自动机,Link-Cut Tree)

    [BZOJ2555]SubString(后缀自动机,Link-Cut Tree) 题面 BZOJ 题解 这题看起来不难 每次要求的就是\(right/endpos\)集合的大小 所以搞一个\(LCT\ ...

  2. 【NOIP2015】斗地主(搜索,贪心)

    题面戳我 题解 我原来也觉得是一道不可做的难题.. 其实,,,很简单的啦... 对于当前状态 我们出牌的方式大致分为两类 一类是不用考虑点数的,包括单张,对子,三带一等 另一类就是需要考虑点数的,包括 ...

  3. 踩坑系列の Oracle dbms_job简单使用

    二话不说先上代码 --创建存储过程 create or replace procedure job_truncateState is begin --此处就是要定时执行的sql execute imm ...

  4. 关于在Django中Json无法序列化datetime的解决办法

    我们在网页设计时经常会在前端和后台进行交互,前端回传的方法可以时redirect一个地址加上显式的参数,第二个办法就是使用Ajax结构.那么在传到view函数中进行处理后是需要通过Json格式进行返回 ...

  5. C# 登录 存Session ,cookie并且验证只能一个人登录以及清session并且Cache

    string id = ConvertHelper.GetString(ds.Tables[0].Rows[0]["Uid"]);//用户ID string struserid = ...

  6. 记录一次网站漏洞修复过程(三):第二轮处理(拦截SQL注入、跨站脚本攻击XSS)

    在程序编写的时候采用参数化的SQL语句可以有效的防止SQL注入,但是当程序一旦成型,再去修改大量的数据库执行语句并不是太现实,对网页表单上输入进行校验是易于实现的方法.在webForm 页面中开启校验 ...

  7. MyBatis笔试题

    1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="UTF-8"? ...

  8. Django 2.0 学习(04):Django数据库

    数据库设置/配置 打开mysite/settings.py,我们会发现Django是用的是默认的数据库SQLite,如下图所示: Django也是支持其它数据库的,比如PostgreSQL.MySQL ...

  9. 第八届蓝桥杯B组java第四题

    标题:取数位 求1个整数的第k位数字有很多种方法.以下的方法就是一种.对于题目中的测试数据,应该打印5.请仔细分析源码,并补充划线部分所缺少的代码.注意:只提交缺失的代码,不要填写任何已有内容或说明性 ...

  10. poj-1008-玛雅历

    Description 上周末,M.A. Ya教授对古老的玛雅有了一个重大发现.从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法.这个Haab历法 ...