微信个人订阅号简单实现在线收款

项目简介

用计算机六进制从 000000 -111111,即 0到63 来表示易经中的64个卦象,然后根据用户在公众号输入的摇卦数据返回对应的卦象,并实现在线接收用户的打赏。

环境准备

准备好一个域名, 如果没有的话可以用花生壳或者其他工具,网上方法很多,你懂得。
因为微信的服务器会通过你的域名将信息发送到你的应用程序。

订阅号设置

  1. 基础信息配置;在这里插入图片描述
    这里获取 AppId 和 Secret

  2. 服务器配置;
    在这里插入图片描述
    URL: http://域名/接口 比如 https://x1p1.xxx.com/wx/trans, 这里 https 是协议,x1p1.xxx.com 是你的域名,wx/trans 是你应用程序和微信的交互接口,即微信会把签名后的消息发送你程序中这个入口。程序在这里完成消息的验证和路由。
    Token: 自己随便写了,确保和程序里面 一致,比如我这里是 tokendabaobei
    AES: 用于密文传输使用的加密解密字符串,随机生成即可,和用用程序保持一致。
    下面是程序中的配置,我用的是SpringBoot开发

    server:
    	port: 65000
    spring:
    	application:
    		 name: itg-wx-client-center
    	thymeleaf:
    		mode: HTML
    		encoding: UTF-8
    		content-type: text/html
    		cache: false
    wx:
     mp:
     	appId: 和公众号一致
     	secret: 和公众号一致
     	token:  和公众号一致
     	aesKey: 和公众号一致
    

到这里配置已经完成了。

核心代码

核心代码就是接收和响应用户通过微信服务器发过来的消息。即上面的 /wx/trans 。

/**
 * 微信消息入口
 */
@RestController
@RequestMapping("/wx/trans")
public class WxMsgTransController {

    @Autowired
    private WxMpService mpService;    				//  开源的 开发包
    @Autowired
    private CoreService coreService;                // 消息校验和路由
    @Autowired
    protected WxMpConfigStorage configStorage;      // 持久化

    /*
     * 微信消息统一入口
     */
    @ResponseBody
    @PostMapping(produces = "application/xml; charset=UTF-8")
    public void post( @RequestParam("signature") String signature,
                     @RequestParam(name = "encrypt_type", required = false) String encType,
                     @RequestParam(name = "msg_signature", required = false) String msgSignature,
                     @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,
                     HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        // check signature!
        if (!mpService.checkSignature(timestamp, nonce, signature)) {  
            response.getWriter().println("Error, IllegelParameter");
            return;
        }
        // 是否密文
        String encryptType = StringUtils.isBlank(encType) ? "raw" : encType;
        if ("raw".equals(encryptType)) {
            WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
            // 路由消息到对应的handler
            WxMpXmlOutMessage outXml = coreService.route(inMessage);
            if (outXml == null) {
                response.getWriter().write("");
            } else {
                response.getWriter().write(outXml.toXml());
            }
            return;
        }
        if ("aes".equals(encryptType)) {
            WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, mpService.getWxMpConfigStorage(), timestamp, nonce, msgSignature);
            WxMpXmlOutMessage outMessage = coreService.route(inMessage);
            if (outMessage == null) {
                response.getWriter().write("");
            } else {
                response.getWriter().write(outMessage.toEncryptedXml(configStorage));
            }
            return;
        }
        response.getWriter().println("不可识别的加密类型");
    }
}

路由代码:

    @Override
    public void refreshRouter() {
        final WxMpMessageRouter newRouter = new WxMpMessageRouter(
            this.wxMpService);
        // 所有事件的日志
        newRouter.rule().handler(this.logHandler).next();
        // 关注事件
        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
            .event(WxConsts.EventType.SUBSCRIBE).handler(this.subscribeHandler)
            .end();
        // 取消关注事件
        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
                .event(WxConsts.EventType.UNSUBSCRIBE).handler(this.unSubscribeHandler)
                .end();
        // 默认
        newRouter.rule().async(false).handler(this.msgHandler).end();
        this.router = newRouter;
    }

Handler代码:

/**
 * 用户关注公众号Handler
 * <p>
 */
@Component
public class SubscribeHandler extends AbstractHandler {

    @Override
    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context,
                                    WxMpService wxMpService, WxSessionManager sessionManager) {
        // 个人订阅号能操作微信的API很少,权限很少, 不能获取openid,等用户信息
     return WxMpXmlOutMessage.TEXT()
            .content(StringTable.subscribeMsg)
            .fromUser(wxMessage.getToUser())
            .toUser(wxMessage.getFromUser())
            .build();
    }
}

这里就完成了一次信息的交互,后面会提供完成代码。

打赏链接的制作

1 申请微信个人商户,这个很简单,拍几张门面照片就可以申请通过,也很快捷。
2 开通好后会有 生成一个微信收款商业版的 链接 如: https://payapp.wechatpay.cn/qrpay/order/home2?key=idc_CHNDVI_GRYyYjNZIWOy.Ykdd1Z8CA–, 点进去如下图:
在这里插入图片描述
在我们的消息中加入上面的连接就可以收款了,呵呵。。。
在这里插入图片描述
点击: 点此捐赠 到收款

在线演示

可关注 wenwang64 公众号,进行体验。

源码下载

https://download.csdn.net/download/u010209554/86909531

pxpay 是一个微信支付宝个人收款接口。支持微信/支付宝 收款监控个人收款,无需签约支付宝、微信支付,为支付宝、微信支付的个人账户,提供即时到账收款 API 接口。 这个是客户端。安卓 APP 监控收款通知还有一个 xposed 的端,原理百度一下,查看 xposed 的版本,网上一大票。就是监控通知。所以手机的设置很重要。需要把各种权限打开。让你要监控的目标把通知打开。判断标准就是,听到语音播报就可以。(美丽动听的支付宝到账 100 元) 原理: 监控到支付宝到账 100 元,然后我们拿到这个通知告诉我们的网站:我刚才收到了 100 元。 最近谁下了订单?嗯。最近张三说要还我 100 块钱。那就是张三咯。好,标记张三还钱 100 成功。 完成 那张三和李四都说要还 100 怎么办?那就张三。你还 99。99;李四你还 100。01 说好的数字。倒是后我收到多少钱就是谁还的。 所以我们一个金额的二维码要多设置几张。 收款码金额识别: 二维码的金额需要入数据库才可以在用户订单选择 5 元的时候,展示 5。01 元的收款码,如果让客户一张张的手动输入金额。那还用程序员干啥? 微信支付宝的收款码金额识别: 框架是没有。但是收费 API 有。可以把收款码上传给 API,阿里云/腾讯云/百度云 都有文字识别 API。腾讯云一天 1000 是免费的。可以用。 这里使用的是腾讯云的 OCR,识别二维码的收款金额; 调用 API 即可获取二维码上的所有文字。找到¥符。正则匹配即可。 不怕一万就怕万一。如果哪个订单收到钱而未触发订单完成。那么就需要手动完成一下订单咯。(比如关机,断网,都有可能导致) 订单管理,列出了自己的所有订单。看看有没有失败的订单(收到钱,没发货)。手动点一下完成即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrTangLY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>