小程序微信支付实践案例-JAVA

微信支付接入总让我产生一种很容易的幻觉,但自己又不知道从何下手。平时每次去买东西,点击支付后拉起来的支付界面,我很好奇,想自己玩一下。

如果你从来没有过微信支付相关实践经验,你肯定会去看微信官方文档,然后看了好几遍还会一脸懵逼,反正我是这样的…

以下是我查阅微信支付官方文档和网上查找资料后做的总结:

先强调一下,必须要先申请到商户相关资料,如果没有申请条件(需要营业执照),还是别瞎折腾了…
申请入口:微信支付商户注册

准备商户相关资料,须包含以下:
mchId (商户号)由微信生成
mchKey (API秘钥)调V2版本的接口才需要
apiV3Key (APIV3秘钥)V3版本接口才需要,可以两者都设置
certSerialNo (证书序列化)
证书文件,一共3份
apiclient_cert.p12
apiclient_cert.pem
apiclient_key.pem
appId (注意是小程序的应用ID) 在小程序后台-开发管理-开发设置页面查看

Java后端

有了以上资料,接下来就是接口调用了,可以直接使用官方提供的SDK,也可以使用第三方的,我是使用第三方的,依赖以下jar包:

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-pay</artifactId>
    <version>4.1.0</version>
</dependency>

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>4.1.0</version>
</dependency>
public static void main(String[] args) {
        WxPayConfig wxPayConfig = new WxPayConfig();
        wxPayConfig.setMchId("1623324432");
        wxPayConfig.setAppId("wxaxxxxxxxxxxx");
        wxPayConfig.setMchKey("1245adfsadghgdfhfg");
        wxPayConfig.setApiV3Key("Imdaskldkladklaaskllads");
        wxPayConfig.setCertSerialNo("ASDFADF132534");
        wxPayConfig.setKeyPath("C:\\Users\\LENOVO\\Desktop\\wx_pay\\apiclient_cert.p12");
        wxPayConfig.setPrivateCertPath("C:\\Users\\LENOVO\\Desktop\\wx_pay\\apiclient_cert.pem");
        wxPayConfig.setPrivateKeyPath("C:\\Users\\LENOVO\\Desktop\\wx_pay\\apiclient_key.pem");

       // 小程序支付
        wxPayConfig.setTradeType(WxPayConstants.TradeType.JSAPI);

        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(wxPayConfig); //微信配置信息

        // 官方接口文档地址- https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_1.shtml
        String url = "/v3/pay/transactions/jsapi";
        try {
            JSONObject jsonObject = WxpayV3Util.unifiedOrderV3(url, param(), wxPayService);
            logger.info("支付返回:{}", jsonObject);
        } catch (WxPayException e) {
            e.printStackTrace();
        }

    }

	private static JSONObject param() {
        String payOrderId = "12345678903423534539";

        // 微信统一下单请求对象
        JSONObject reqJSON = new JSONObject();
        reqJSON.put("out_trade_no", payOrderId);
        reqJSON.put("description", "我是一个商品");
        // 订单失效时间,遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,示例值:2018-06-08T10:34:56+08:00
//        reqJSON.put("time_expire", String.format("%sT%s+08:00", DateUtil.format(orderPay.getExpiredTime(), DatePattern.NORM_DATE_FORMAT), DateUtil.format(orderPay.getExpiredTime(), DatePattern.NORM_TIME_FORMAT)));

        reqJSON.put("notify_url", "https://www.baidu.com");
        JSONObject amount = new JSONObject();
        amount.put("total", 888888);
        amount.put("currency", "CNY");
        reqJSON.put("amount", amount);

        JSONObject sceneInfo = new JSONObject();
        sceneInfo.put("payer_client_ip", "172.130.100.39");
        reqJSON.put("scene_info", sceneInfo);

        reqJSON.put("appid", "wxaxxxxxxxxxxx");
        reqJSON.put("mchid", "1623324432");

        JSONObject payer = new JSONObject();
        payer.put("openid", "o6Kjkafkldajkfdskjfjkdfkjx-bfmdfmd5");
        reqJSON.put("payer", payer);

        return reqJSON;
    }

WxpayV3Util.java

	private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com";

    public static JSONObject unifiedOrderV3(String reqUrl, JSONObject reqJSON, WxPayService wxPayService) throws WxPayException {
        String response = wxPayService.postV3(PAY_BASE_URL + reqUrl, reqJSON.toJSONString());
        return JSONObject.parseObject(getPayInfo_(response, wxPayService.getConfig()));
    }

    public static String getPayInfo_(String response, WxPayConfig wxPayConfig)  throws WxPayException {
        try {
            JSONObject resJSON = JSON.parseObject(response);
            String timestamp = String.valueOf(System.currentTimeMillis() / 1000L);
            String nonceStr = SignUtils.genRandomStr();
            String prepayId = resJSON.getString("prepay_id");

            Map<String, String> payInfo = new HashMap<>(8);

            String appid = wxPayConfig.getAppId(); 

            payInfo.put("appId", appid);
            payInfo.put("timeStamp", timestamp);
            payInfo.put("nonceStr", nonceStr);
            payInfo.put("package", "prepay_id=" + prepayId);
            payInfo.put("signType", "RSA");

            String beforeSign = String.format("%s\n%s\n%s\n%s\n", appid, timestamp, nonceStr, "prepay_id=" + prepayId);
            payInfo.put("paySign", SignUtils.sign(beforeSign, PemUtils.loadPrivateKey(new FileInputStream(wxPayConfig.getPrivateKeyPath()))));
            // 签名以后在增加prepayId参数
            payInfo.put("prepayId", prepayId);
            return JSON.toJSONString(payInfo);
        } catch (Exception e) {
            throw (e instanceof WxPayException) ? (WxPayException) e : new WxPayException(e.getMessage(), e);
        }
    }

支付返回结果示例:

支付返回:{"timeStamp":"1669104769","package":"prepay_id=wxxxxxxxxxxxxxxxxxxxxx45f0000","paySign":"dK0jZZU5WkUS+DPwwt/asasas/meVi38HP68erz9kaAseZHYubkzrii+asa+C2VqQ+SshjWG/0oM/asa+asas+asas/y93SP8VCWU71Jw+asas+asa+asas==","appId":"wxaxxxxxxxxxxx","signType":"RSA","prepayId":"wxxxxxxxxxxxxxxxxxxxxx45f0000","nonceStr":"rlaiAJ9hgGrPzNCevzb7gN5D3W2R9BNw"}

小程序端

唤起微信支付界面接口,就是这一个接口,其实真的很容易对吧。

wx.requestPayment(
{
	"timeStamp":"",
	"nonceStr": "",
	"package": "",
	"signType": "RSA",
	"paySign": "",
	"success":function(res){},
	"fail":function(res){},
	"complete":function(res){}
})

将后台返回的支付结果参数赋值到对应的位置即可调起微信支付界面了。

效果展示如下
在这里插入图片描述

值得注意的地方:

  1. openid 这个参数必须是在当前小程序下的openid,因为同一个用户在不同小程序下是不一样的,可以通过授权登录小程序获取到,也可以通过微信小程序提供的接口换取(https://api.weixin.qq.com/sns/jscode2session?appid=wxaxxxxxxxxxxx&secret=222&js_code=‘+code +’&grant_type=authorization_code)

  2. 微信开发者工具中这个AppId要和接口保持一致,要不然调用wx.requestPayment接口会报:requestPayment:fail no permission
    在这里插入图片描述

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
**微信小程序案例:SSM食堂窗口自助点餐系统** 此资源是一套完整、可二次开发的计算机专业毕业设计项目,致力于解决食堂窗口的自助点餐问题。基于微信小程序平台,采用SSM(Spring + Spring MVC + MyBatis)框架进行开发,确保了系统的稳定性与扩展性。 **一、核心功能** 1. 用户登录与注册:用户通过微信一键授权登录,方便快捷;同时提供邮箱注册选项。 2. 菜单浏览与搜索:用户可查看当前窗口提供的所有菜品,并通过关键词搜索快速定位目标菜品。 3. 点餐与支付:用户将心仪菜品加入购物车,确认无误后在线支付,支持多种支付方式。 4. 个人中心:用户可查看历史订单、收藏菜品等个人信息,方便再次点餐。 5. 后台管理:管理员可对菜品、订单等进行实时监控与管理,确保系统高效运行。 **二、技术亮点** 1. 微信小程序原生开发,充分利用微信生态优势,为用户提供流畅的使用体验。 2. SSM框架整合,分层明确,易于维护与升级。 3. MyBatis作为数据持久层框架,简化数据库操作,提高开发效率。 4. 前后端分离设计,降低耦合度,便于二次开发与定制。 5. 完善的异常处理机制,确保系统稳定运行。 **三、资源包含** 1. 源代码(Java、XML、JavaScript、WXML、WXSS等)。 2. 说明文档(需求分析、系统设计、数据库设计、使用说明等)。 3. 测试数据与演示视频。 此资源旨在帮助计算机专业毕业生快速构建一个高质量的毕业设计项目,同时也为相关开发者提供一个可二次开发的参考模板。
这是一个关于计算机专业毕业设计的微信小程序案例——新生报到系统。该系统旨在帮助高校简化新生报到的流程,提高报到效率,并为新生提供便捷的入学服务。本资源包含了完整的毕业设计论文、源代码及详细的说明文档,可为您的毕业设计提供有力支持。 在这个系统中,新生可以通过微信小程序完成在线报到,包括填写个人信息、选择宿舍、缴纳学费等操作。同时,系统还支持管理员对新生信息进行管理和统计,以便更好地为新生提供服务。此外,系统还具有消息通知功能,新生可以随时查看自己的报到进度和相关通知。 该系统采用前后端分离的开发模式,前端使用微信小程序进行开发,后端采用Java语言和Spring Boot框架实现。数据库方面则采用了MySQL数据库,以确保数据的安全性和稳定性。系统具有良好的扩展性,可以根据实际需求进行二次开发定制,以满足不同高校的需求。 资源包中包含的论文详细阐述了系统的需求分析、设计思路、技术选型、实现过程以及测试结果。源代码部分则包括了前端和后端的全部代码,以及相关的数据库脚本。说明文档则为开发者提供了详细的系统部署和使用指南。 总之,这个微信小程序新生报到系统是一个具有实际应用价值的毕业设计案例。它结合了当前高校的实际需求,采用了先进的技术和框架,实现了高效、便捷的新生报到服务。希望这个资源能为您提供灵感和帮助,祝您毕业设计顺利!
**微信小程序案例:SSM(Spring、SpringMVC、MyBatis)短视频系统** 此资源为计算机专业毕业设计提供了一个完整的实战项目。它是一个基于微信小程序的短视频系统,采用目前流行的SSM框架进行开发,实现了前后端分离,提高了系统的可维护性和扩展性。 一、项目简介 该系统旨在为用户提供一个便捷的短视频发布和分享平台。用户可以在这里观看、上传、评论和分享各种有趣的短视频。系统具有以下核心功能: 1. 用户注册与登录 2. 短视频发布与管理 3. 视频播放与评论 4. 用户关注与粉丝管理 5. 个性化推荐 二、技术栈 1. 前端:微信小程序 2. 后端:Spring、SpringMVC、MyBatis 3. 数据库:MySQL 4. 服务器:Tomcat 5. 版本控制:Git 三、特色与创新 1. 采用前后端分离架构,降低了开发和维护成本。 2. 使用了Spring Security进行权限管理,保证了系统的安全性。 3. 利用MyBatis实现了ORM映射,简化了数据库操作。 4. 采用了Redis缓存技术,提高了系统性能。 5. 实现了个性化推荐算法,提升了用户体验。 四、资源内容 1. 源代码:包含前端小程序代码和后端Java代码。 2. 说明文档:详细阐述了项目的需求分析、设计思路、实现细节和测试报告。 3. 数据库脚本:用于创建和初始化数据库表结构。 4. 开发环境配置文件:包括服务器配置、数据库连接配置等。 五、二次开发与定制 该系统具有较高的可扩展性和可维护性,便于二次开发与定制。开发者可以根据自己的需求,修改源代码以满足特定业务场景的需求。同时,我们也提供技术支持服务,帮助开发者解决开发过程中遇到的问题。
好的,以下是Spring Boot 2.0小程序支付功能实现weixin-java-pay的完整代码: 1. 引入weixin-java-pay依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>3.8.0</version> </dependency> ``` 2. 配置微信支付参数 在application.yml或application.properties文件中配置微信支付参数,例如: ```yaml wx: pay: appId: xxx mchId: xxx mchKey: xxx notifyUrl: xxx ``` 3. 创建订单 在程序中创建订单,并将订单信息封装到UnifiedOrderRequest对象中,例如: ```java UnifiedOrderRequest request = new UnifiedOrderRequest(); request.setBody("测试订单"); request.setOutTradeNo("2018061500000001"); request.setTotalFee(1); request.setSpbillCreateIp("127.0.0.1"); request.setTradeType(TradeType.JSAPI); request.setOpenid("xxxxxx"); ``` 4. 调用微信支付接口 使用WxPayService对象调用微信支付接口,例如: ```java WxPayService wxPayService = new WxPayServiceImpl(); WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request); ``` 5. 获取支付参数 根据微信支付接口返回的结果,获取支付参数并返回给小程序,例如: ```java WxPayJsapiSignature signature = wxPayService.createJsapiSignature("prepay_id=" + result.getPrepayId(), false); Map<String, String> payParams = new HashMap<>(); payParams.put("appId", signature.getAppId()); payParams.put("timeStamp", signature.getTimestamp()); payParams.put("nonceStr", signature.getNonceStr()); payParams.put("package", signature.getPackageValue()); payParams.put("signType", signature.getSignType()); payParams.put("paySign", signature.getPaySign()); return payParams; ``` 完整代码如下: ```java @RestController @RequestMapping("/pay") public class PayController { @Autowired private WxPayService wxPayService; @Value("${wx.pay.appId}") private String appId; @PostMapping("/unifiedOrder") public Map<String, String> unifiedOrder(@RequestParam("openid") String openid, @RequestParam("totalFee") int totalFee) throws WxPayException { // 创建订单 UnifiedOrderRequest request = new UnifiedOrderRequest(); request.setBody("测试订单"); request.setOutTradeNo("2018061500000001"); request.setTotalFee(totalFee); request.setSpbillCreateIp("127.0.0.1"); request.setTradeType(TradeType.JSAPI); request.setOpenid(openid); // 调用微信支付接口 WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request); // 获取支付参数 WxPayJsapiSignature signature = wxPayService.createJsapiSignature("prepay_id=" + result.getPrepayId(), false); Map<String, String> payParams = new HashMap<>(); payParams.put("appId", signature.getAppId()); payParams.put("timeStamp", signature.getTimestamp()); payParams.put("nonceStr", signature.getNonceStr()); payParams.put("package", signature.getPackageValue()); payParams.put("signType", signature.getSignType()); payParams.put("paySign", signature.getPaySign()); return payParams; } @PostMapping("/notify") public String notify(HttpServletRequest request) throws WxPayException { // 处理支付结果通知 WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(request.getInputStream()); // 处理业务逻辑,并返回响应给微信支付系统 return WxPayNotifyResponse.success("处理成功"); } } ``` 其中,/pay/unifiedOrder接口用于创建订单并获取支付参数,/pay/notify接口用于处理支付结果通知。注意,支付结果通知的处理需要验签,可以使用WxPayService对象的checkSignature方法来验签,或者使用WxPayConfig对象的checkSignature方法来验签。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值