kangna 8 年之前
父节点
当前提交
639ce328e8
共有 4 个文件被更改,包括 428 次插入0 次删除
  1. 6 0
      .idea/vcs.xml
  2. 42 0
      index.html
  3. 363 0
      main.js
  4. 17 0
      package.json

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 42 - 0
index.html

@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
+    <title>Document</title>
+</head>
+<body>
+    <div id="div">123</div>
+    <button onclick="pay()">支付</button>
+</body>
+<script>
+const pay = async () => {
+    WeixinJSBridge.invoke(
+        'getBrandWCPayRequest', {
+            "appId":"wxb558057b16b95dd5",
+            "timeStamp":"1525749068",
+            "nonceStr":"LWm32hoWaAZ0zBZh",
+            "package":"prepay_id=wx08111107238333432f16f39e3492244899",
+            "signType":"MD5",
+            "paySign":"347C9BB74842B310FFA6B5EE0B0E0AA1",
+            "timestamp":"1525749068"
+        },
+        function(res){
+            if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
+        }
+    );
+    if (typeof WeixinJSBridge == "undefined"){
+        if( document.addEventListener ){
+            document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
+        }else if (document.attachEvent){
+            document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
+            document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
+        }
+    }else{
+        onBridgeReady();
+    }
+}
+</script>
+</html>

+ 363 - 0
main.js

@@ -0,0 +1,363 @@
+const express = require('express'),
+    app = express(),
+    bodyParser = require('body-parser'),
+    axios = require('axios'),
+    tenpay = require('tenpay'),
+    qr = require('qr-image'),
+    qs = require('querystring'),
+    imger = require('./src/image/imageCaptcha'),
+    phoneer = require('./src/phone/phoneCaptcha'),
+    email = require('./src/email/emailCaptcha'),
+    sqldata = require('./src/session/sqler'),
+    SMSClient = require('@alicloud/sms-sdk'),
+    emailer = new email(),
+    getphone = new phoneer(),
+    generate = new imger(),
+    session = require('express-session'),
+    accessKeyId = 'LTAI1axR0bfBECLK',
+    secretAccessKey = 'i4BARcxzLumd4SV2VeSero6VigEAqT',
+    smsClient = new SMSClient({accessKeyId, secretAccessKey})
+
+// app.use('/', express.static(__dirname + '/test'))
+app.use(session({
+    secret: 'captcha',
+    cookie: {
+        maxAge: 300000
+    },
+    saveUninitialized: true,
+    resave: true,
+    name: 'verificationcode'
+}))
+app.use(bodyParser.urlencoded({extended:false}))
+
+
+/**
+ * 跨域解决方案
+ * 
+*/
+
+app.all('*', (req, res, next) => {
+    res.header("Access-Control-Allow-Origin", req.headers.origin); //设置来源
+    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
+    res.header("Access-Control-Max-Age", "604800000");
+    res.header("Access-Control-Allow-Credentials", true);
+    res.header("X-Powered-By", ' 3.2.1');
+    // res.header("Content-Type", "application/json;charset=utf-8");
+    next();
+});
+
+/**
+*@effect 获取图形验证码
+*return Object newimg(图像的路径)
+*/
+app.get('/getImage', (req, res) => {
+    let svgimg = generate.captcha(4, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 2, true)
+    req.session.imgtext = svgimg.text
+    res.status(201).send({
+        svg: svgimg.data
+    })
+})
+
+app.get('/notify', async (req, res) => {
+   res.send(req.body)
+})
+
+/**
+*@effect 验证图形验证码
+*return object status (true/false)
+*/
+
+app.post('/postImagetext', (req, res) => {
+    if(req.session.imgtext){
+        if(req.session.imgtext == req.body.imgtexter){
+            res.status(201).send()
+        }else{
+            res.status(202).send({
+                err: '验证码错误'
+            })
+        }
+    }else{
+        res.status(203).send({
+            err: '未获取验证码'
+        })
+    }
+})
+
+/**
+ * @effect 获取手机验证码
+ * 
+*/
+
+app.post('/postPhone', (req, res) => {
+    let userphone = req.body.userphone
+    getphone.set(userphone, req, res, (data) => {
+        req.session.phonetext = data.obj
+        if(data.code == 200){
+            res.status(201).send()
+        }else{
+            res.status(202).send({
+                err: '服务器出错'
+            })
+        }
+    })
+})
+
+/**
+ * @effect 验证手机验证码
+ * 
+*/
+
+app.post('/postphonetext', (req, res) => {
+    if (req.session.phonetext){
+        if (req.session.phonetext != req.body.userphonetext) {
+            res.status(202).send({
+                err: '验证码错误'
+            })
+        }else{
+            res.status(201).send()
+        }
+    }else{
+        res.status(203).send({
+            err: '未获取验证码'
+        }) 
+    }
+})
+
+/**
+ * @effect 发送邮箱验证码
+ * 
+*/
+
+app.post('/postemail', (req, res) => {
+    let useremail = req.body.useremail
+    emailer.main(useremail, (info, statu) => {
+        if (statu) {
+            req.session.emailtext = info
+            res.status(201).send()
+        } else {
+            res.status(202).send({
+                err: info
+            })
+        }
+    })
+})
+
+/**
+ * @effect 验证邮箱验证码
+ * 
+*/
+
+app.post('/postemailtext', (req, res) => {
+    if(req.session.emailtext){
+        if(req.session.emailtext != req.body.useremailtext){
+            res.status(202).send({
+                err: '验证码错误'
+            }) 
+        }else{
+            res.status(201).send() 
+        }
+    }else{
+        res.status(203).send({
+            err: '未获取验证码'
+        }) 
+    }
+})
+
+/**
+ * @effect session验证
+ */
+
+app.post('/postsession', (req, res) => {
+    let cc = new sqldata (req.body.host, req.body.user, req.body.password, req.body.database, req.body.port, req.body.table, req.body.username, req.body.userpassword)
+    cc.db((data,onlineusername)=>{
+        if(data["1"] != 1){
+            res.session.online = true
+            res.session.onlineusername = onlineusername
+            res.send({
+                status: false
+            }) 
+        }else{
+            res.send({
+                status: true
+            }) 
+        }
+    })
+})
+
+app.get('/getsessiontext', (req, res) => {
+    if(req.session.online && req.session.onlineusername){
+        if(req.session.onlineusername == req.body.onlineusername){
+            res.send({
+                status: true
+            })
+        }else{
+            res.send({
+                status: false
+            })
+        }
+    }else{
+        res.send({
+            status: false
+        })
+    }
+})
+
+app.post('/postnumber', async (req, res) => {
+    if (/^1[3|4|5|8][0-9]\d{4,8}$/.test(req.body.number)) {
+        if (req.session.code) {
+            res.status(202).send({
+                err: '不要多次发送消息噢'
+            })
+        } else {
+            let code = Math.floor(Math.random() * 99999)
+            req.session.code = code
+            try{
+                let data = await main(req.body.number, code)
+                if (data.Code === 'OK') {
+                    res.status(201).send({
+                        code: 'ok'
+                    })
+                } else {
+                    res.status(202).send({
+                        err: '服务器繁忙,请重新再试'
+                    })
+                }
+            } catch (e) {
+                if (e.code == "isv.BUSINESS_LIMIT_CONTROL") {
+                    res.status(202).send({
+                        err: '你号码已经限流,请稍后再试'
+                    })
+                } 
+            }
+        }
+    } else {
+        res.status(202).send({
+            err: '请检查手机格式是否正确'
+        })
+    }
+})
+
+
+app.post('/verifi', (req, res) => {
+    if (req.session.code) {
+        if (req.body.code == req.session.code) {
+            res.status(201).send({
+                code: 'ok'
+            })
+        } else {
+            res.status(202).send({
+                err: '验证码错误'
+            })
+        }
+    }else {
+        res.status(202).send({
+            err: '还没发送验证码噢'
+        })   
+    }
+})
+
+const config = {
+    appid: 'wxb558057b16b95dd5',
+    mchid: '1391101602',
+    partnerKey: 'WLfN6xZt60JL2Pj1HFb72VA48IPofN3n',
+    notify_url: 'http://api.cloudsql.1473.cn/wechatredirect',
+}
+
+const payconfig = {
+    appid: 'wxb558057b16b95dd5',
+    redirect_uri: 'http://api.cloudsql.1473.cn/wechatredirect',
+    response_type: 'code',
+    scope: 'snsapi_base',
+    state: 'test'
+}
+
+const api = new tenpay(config);
+
+
+const pay = async (msg, req) => {
+    let ordersid = Date.now().toString()
+    req.session.ordersid = ordersid
+    let result = await api.unifiedOrder({
+        out_trade_no: req.session.ordersid,
+        body: '商品简单描述',
+        total_fee: 1,
+        openid: msg
+    });
+    return result
+}
+
+const buildSign = (json) => {
+    return 'http://weixin.1473.cn/index/index.html?' + qs.stringify(json) + '#wechat_redirect'
+}
+
+app.get('/wechatredirect', async (req, res) => {
+    req.session.erre = '123'
+    console.log(req.session.erre)
+    try {
+        if (req.query.code) {
+            let code = await axios.get('https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxb558057b16b95dd5&secret=46237a17fbc57f5ebc5cc93c2b8cc505&code=' + req.query.code + '&grant_type=authorization_code')
+            let orders = await pay(code.data.openid, req)
+            let result = await api.getPayParamsByPrepay({
+              prepay_id: orders.prepay_id
+            });
+            req.session.prepay = result
+            res.redirect('/pay')
+        } else {
+            res.send('服务器出错,请重新发送请求')
+        }
+    } catch (e) {
+        res.send(e)
+    }
+})
+
+app.get('/getorders', (req, res) => {
+    res.send(req.session.prepay)
+})
+
+app.get('/pay', async (req, res) => {
+    console.log(req.session.erre)
+    res.sendFile(__dirname + '/wechatpay/index.html');
+})
+
+app.post('/selectorders', async (req, res) => {
+    console.log(req.session.erre)
+    let result = await api.orderQuery({
+        out_trade_no: ordersid
+    });
+    res.send(result)
+})
+
+app.get('/getqr', async (req, res) => {
+    let msg = req.query
+    if (msg) {
+        let qrurl = await buildSign(payconfig)
+        let code = await qr.image(qrurl, {size : 50})
+        code.pipe(res)
+    } else {
+        res.send('请传入正确的参数')
+    }
+})
+
+app.get('/orderquery', async (req, res) => {
+    let result = await api.orderQuery({
+        out_trade_no: req.query.older
+    });
+})
+
+const main = async (number, code) => {
+    let data = await smsClient.sendSMS({
+        PhoneNumbers: number,
+        SignName: '阿里云短信测试专用',
+        TemplateCode: 'SMS_133180335',
+        TemplateParam: '{"code":"' + code + '"}'
+    })
+    return data
+}
+
+
+
+
+app.listen('9000', () => {
+    console.log('service listing port 9000')
+})

+ 17 - 0
package.json

@@ -0,0 +1,17 @@
+{
+  "name": "wechatpay",
+  "version": "1.0.0",
+  "description": "wechat QR pay",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "kangna",
+  "license": "ISC",
+  "dependencies": {
+    "axios": "^0.18.0",
+    "express": "^4.16.3",
+    "qr-image": "^3.2.0",
+    "tenpay": "^2.1.4"
+  }
+}