使用java编写微信jsapi支付

前置准备

商户api证书

证书序列号

商户APIV3密钥

一个你可以使用的公网域名

开发

首先学习uniapp的使用(小程序开发必须要的)

深入学习微信sdk是如何使用的(重中之重,了解好可以极大加快开发效率【我在这里吃了不少亏,一开始我是自己写签名属性方法,直到遇到一个实在不知道怎么写的功能,最后好好了解才会用的】)

关于微信sdk:

当你导入maven或或者gradle的时候就相当你已经把微信的GitHub项目导到你本地了。它的作用就像jdk一样

gradle:

当你使用gradle测试时你会报slf4j与logger错误

解决在你使用的模块上的buid.gradle加如下代码

至于GBK错误自己改编码

Maven:

当你导入微信的maven时你测试时会报第一个错误

一个kotlin错误

这是因为你外部有一个kotlin,微信sdk里面也有一个kotlin

这时导入下面一个包,错误便消失了。

<dependency>

<groupId>org.jetbrains.kotlin</groupId>

<artifactId>kotlin-stdlib</artifactId>

<version>1.3.72</version>

</dependency>

接下来你会碰到第二错误当你运行jsapi下单时会报证书错误

修改

获取openid

第一步:用户同意授权,获取code

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(已认证服务号,默认拥有scope参数中的snsapi_base和snsapi_userinfo 权限),引导关注者打开如下页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

参数说明

参数是否必须说明
appid公众号的唯一标识
redirect_uri授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type返回类型,请填写code
scope应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
state重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect无论直接打开还是做页面302重定向时候,必须带此参数
forcePopup强制此次授权需要用户弹窗确认;默认为false;需要注意的是,若用户命中了特殊场景下的静默授权逻辑,则此参数不生效

用户同意授权后

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

第二步:通过code换取网页授权access_token

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

请求方法

获取code后,请求以下链接获取access_token:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数是否必须说明
appid公众号的唯一标识
secret公众号的appsecret
code填写第一步获取的code参数
grant_type填写为authorization_code

后端网络请求

编写工具类

    /**
     * 发送 get 请求
     *
     * @param url 请求地址
     * @return 请求结果
     */
    public static String get(String url,HttpGet httpGet) {
        String result = null;
        CloseableHttpResponse response = null;
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            URI uri = builder.build();
            // 创建http GET请求
//            HttpGet httpGet = new HttpGet(uri);
            httpGet.setURI(uri);
            // 执行请求
            response = httpclient.execute(httpGet);
            if (response.getStatusLine().getStatusCode() == 200) {
                result = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

下单并返回调起支付信息

下单

前端

后端

调起支付

支付回调

补充

微信支付必须配置支付域名

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是Java SpringBoot发起微信JSAPI支付使用V2密钥的代码示例: 1. 首先,在SpringBoot的配置文件中添加微信支付的相关配置信息: ```yaml wxpay: app-id: YOUR_APP_ID mch-id: YOUR_MCH_ID v2-key: YOUR_V2_KEY notify-url: YOUR_NOTIFY_URL ``` 2. 然后,在SpringBoot中定义微信支付的服务类: ```java @Service public class WxPayService { @Autowired private WxPayProperties wxPayProperties; public Map<String, String> createOrder(String openid, String outTradeNo, int totalFee, String body, String ipAddress) throws Exception { // 构造请求参数 Map<String, String> data = new HashMap<>(); data.put("appid", wxPayProperties.getAppId()); data.put("mch_id", wxPayProperties.getMchId()); data.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", "")); data.put("body", body); data.put("out_trade_no", outTradeNo); data.put("total_fee", String.valueOf(totalFee)); data.put("spbill_create_ip", ipAddress); data.put("notify_url", wxPayProperties.getNotifyUrl()); data.put("trade_type", "JSAPI"); data.put("openid", openid); // 生成签名 String sign = WxPayUtil.generateSignature(data, wxPayProperties.getV2Key()); data.put("sign", sign); // 发起统一下单请求 String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; String result = HttpUtil.post(unifiedOrderUrl, WxPayUtil.toXml(data)); Map<String, String> resultMap = WxPayUtil.xmlToMap(result); // 判断下单是否成功 if ("SUCCESS".equals(resultMap.get("return_code")) && "SUCCESS".equals(resultMap.get("result_code"))) { // 构造JSAPI支付参数 Map<String, String> payData = new HashMap<>(); payData.put("appId", wxPayProperties.getAppId()); payData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); payData.put("nonceStr", UUID.randomUUID().toString().replaceAll("-", "")); payData.put("package", "prepay_id=" + resultMap.get("prepay_id")); payData.put("signType", "MD5"); // 生成签名 String paySign = WxPayUtil.generateSignature(payData, wxPayProperties.getV2Key()); payData.put("paySign", paySign); return payData; } else { throw new Exception(resultMap.get("return_msg")); } } } ``` 3. 最后,在Controller层调用微信支付服务类: ```java @RestController @RequestMapping("/wxpay") public class WxPayController { @Autowired private WxPayService wxPayService; @PostMapping("/createOrder") public Map<String, String> createOrder(@RequestParam String openid, @RequestParam String outTradeNo, @RequestParam int totalFee, @RequestParam String body, HttpServletRequest request) throws Exception { String ipAddress = HttpUtil.getIpAddress(request); return wxPayService.createOrder(openid, outTradeNo, totalFee, body, ipAddress); } } ``` 其中,HttpUtil是一个工具类,用于发送HTTP请求。WxPayUtil是一个微信支付的工具类,用于生成签名、XML转换等操作。以上代码示例中,仅提供了微信支付的主要逻辑。具体实现中,还需要根据实际情况,添加异常处理、日志记录等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值