最近闲来无事,看到网上有一些免签支付回调的服务商,当时感觉很新奇,于是自己动手看看怎么玩的,先看成果
App上监听通知并向服务器POST支付信息
服务端的支付订单表
下面说原理及流程
1.App上使用NotificationListenerService监听通知栏通知,一旦微信支付或者支付宝收款收到消息,读取消息的内容,然后使用正则匹配金额
2.App读取到金额后,构造支付订单,支付订单包含:订单号(App自己生成,不是真实的支付方订单号),金额,App端标识,支付方式,签名(保证数据不被篡改)
3.App将订单POST到填写的URL中
4.服务端收到订单信息,先校验签名是否相符,再查看订单是否存在(防止重放攻击),验证通过后存入数据库,并向指定的回调地址发起请求
5.服务端如果向指定的回调地址发起请求失败,使用定时任务重复发起回调,直到回调成功或达到指定次数
以上就是全部过程,服务端使用springboot,可以很快速搭建
当然为了保证可靠性需要给App加固,防止退出,还有这种只能读取到金额,其他信息一无所知,有些局限性
2019-03-14补充:
代码很简单,上传github完全是小题大做,下面贴出关键代码
App部分
继承NotificationListenerService重写onNotificationPosted方法
1 //来通知时的调用
2 @Override
3 public void onNotificationPosted(StatusBarNotification sbn) {
4 Notification notification = sbn.getNotification();
5 if (notification == null) {
6 return;
7 }
8 Bundle extras = notification.extras;
9 if (extras != null) {
10 //包名
11 String pkg = sbn.getPackageName();
12 // 获取通知标题
13 String title = extras.getString(Notification.EXTRA_TITLE, "");
14 // 获取通知内容
15 String content = extras.getString(Notification.EXTRA_TEXT, "");
16 Log.i(TAG, String.format("收到通知,包名:%s,标题:%s,内容:%s", p