kangna 8 lat temu
rodzic
commit
e9859aefc6
10 zmienionych plików z 382 dodań i 220 usunięć
  1. 64 0
      config.js
  2. 12 0
      congif.txt
  3. 57 0
      index.html
  4. 0 129
      index.js
  5. 201 0
      main.js
  6. 12 12
      package.json
  7. 9 0
      sandbox_ali_public.pem
  8. 27 0
      sandbox_iobox_private.pem
  9. 0 48
      test/app.js
  10. 0 31
      test/index.html

+ 64 - 0
config.js

@@ -0,0 +1,64 @@
+const config = {
+    userconfig: {
+        app_id: "2016032301234394",
+        version: "1.0",
+        format: "json",
+        sign_type: "RSA2",
+        method: "alipay.system.oauth.token",
+        timestamp: time,
+        auth_token: null,
+        alipay_sdk: "alipay-sdk-php-20161101",
+        terminal_type: null,
+        terminal_info: null,
+        prod_code: null,
+        notify_url: null,
+        charset: "utf-8",
+        app_auth_token: null,
+        grant_type: 'authorization_code',
+        code: '',
+    },
+    test: {
+        alipay_sdk: 'alipay-sdk-php-20161101',
+        app_id: '2016032301234394',
+        charset: 'utf-8',
+        code: '',
+        format: 'json',
+        grant_type: 'authorization_code',
+        method: 'alipay.system.oauth.token',
+        sign_type: 'RSA2',
+        timestamp: time,
+        version: '1.0'
+    },
+    out: {
+        alipay_sdk: 'alipay-sdk-php-20161101',
+        app_id: '2016032301234394',
+        biz_content: '',
+        charset: 'utf-8',
+        format: 'json',
+        method: 'alipay.trade.create',
+        sign_type: 'RSA2',
+        timestamp: time,
+        version: '1.0',
+    },
+    outreq: {
+        app_id: '2016032301234394',
+        version: '1.0',
+        format: 'json',
+        sign_type: 'RSA2',
+        method: 'alipay.trade.create',
+        timestamp: time,
+        auth_token: null,
+        alipay_sdk: 'alipay-sdk-php-20161101',
+        terminal_type: null,
+        terminal_info: null,
+        prod_code: null,
+        notify_url: null,
+        charset: 'utf-8',
+        app_auth_token: null,
+    }
+}
+
+module.exports = {
+    url,
+    key_get,
+}

Plik diff jest za duży
+ 12 - 0
congif.txt


+ 57 - 0
index.html

@@ -0,0 +1,57 @@
+<!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://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
+    <title>Document</title>
+</head>
+<body>
+    <blockquote><h1>快来给钱</h1></blockquote>   
+    <p id="result">result: </p>
+    <input type="button" id="pay" value="支付咯" />
+    <p id="p"></p>
+</body>
+<script type="application/javascript">
+    // 调试时可以通过在页面定义一个元素,打印信息,使用alert方法不够优雅
+    function log(obj) {
+        $("#result").append(obj).append(" ").append("<br />");
+    }
+
+    $(document).ready(async () => {
+        let data = await $.get("/token" + location.search, function(data){
+            return data;
+        });
+        $("#pay").click(function() {
+           tradePay(data);
+        });
+        $("#closeButton").click(function() {
+           AlipayJSBridge.call('closeWebview');
+        });
+     });
+
+    // 由于js的载入是异步的,所以可以通过该方法,当AlipayJSBridgeReady事件发生后,再执行callback方法
+    function ready(callback) {
+         if (window.AlipayJSBridge) {
+             callback && callback();
+         } else {
+             document.addEventListener('AlipayJSBridgeReady', callback, false);
+         }
+    }
+
+    function tradePay(tradeNO) {
+        ready(function(){
+             // 通过传入交易号唤起快捷调用方式(注意tradeNO大小写严格)
+             AlipayJSBridge.call("tradePay", {
+                  tradeNO: tradeNO
+             }, function (data) {
+                 log(JSON.stringify(data));
+                 if ("9000" == data.resultCode) {
+                     log("支付成功");
+                 }
+             });
+        });
+    }
+</script>
+</html>

+ 0 - 129
index.js

@@ -1,129 +0,0 @@
-var https = require('https');
-var crypto = require('crypto');
-var querystring = require('querystring');
-
-/**
- * alipay_gateway 支付宝默认网关
- * _input_charset 字符编码格式
- * sign_type 签名加密方式
-*/
-
-var basicConfig = {
-    alipay_gateway: 'https://mapi.alipay.com/gateway.do?',
-    _input_charset: 'UTF-8',
-    sign_type: 'MD5',
-    service: 'alipay.wap.create.direct.pay.by.user'
-};
-
-/**
- * https GET 对应的url
- * @param url  @param url 要请求的url
- * @returns {Promise}
- */
-// function httpsGET(url) {
-//     return new Promise(function (resolve, reject) {
-//         var req = https.get(url, function (res) {
-//             res.on('data', function (data) {
-//                 resolve(data);
-//             });
-//         });
-//         req.on('error', function (err) {
-//             reject(err);
-//         });
-//         req.end();
-//     });
-// }
-
-/**
- * 计算签名
- * @param json
- * @returns {string}
- */
-function buildSign(json) {
-    var keys = Object.keys(json);
-    keys = keys.sort();
-    var map = {};
-    for (var i = 0; i < keys.length; i++) {
-        var key = keys[i];
-        if (key !== 'sign' && key !== 'sign_type' && json[key]) {
-            map[key] = json[key];
-        }
-    }
-    var str = querystring.unescape(querystring.stringify(map)) + basicConfig.key;
-    return crypto.createHash(basicConfig.sign_type).update(str, basicConfig._input_charset).digest('hex');
-}
-
-/**
- * 配置
- * @param params
- * {
- *  seller_email:签约支付宝账号或卖家收款支付宝帐户
- *  partner:合作身份者ID,以2088开头由16位纯数字组成的字符串
- *  key:交易安全检验码,由数字和字母组成的32位字符串
- *  notify_url:支付宝服务器通知的页面
- *  return_url:支付后跳转后的页面
- * }
- */
-exports.config = function (params) {
-    Object.assign(basicConfig, params);
-};
-
-/**
- * 使用订单参数构造一个支付请求
- * @param orderParams 订单参数
- * {
- *  body:订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
- *  out_trade_no:你的网站订单系统中的唯一订单号匹配
- *  subject:订单名称显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
- *  total_fee:订单总金额,显示在支付宝收银台里的“应付总额”里
- *  service: 电脑支付create_direct_pay_by_user 手机支付alipay.wap.create.direct.pay.by.user
- * }
- * @returns {string} 支付宝支付请求URL 浏览器跳转到该url支付
- */
-exports.buildDirectPayURL = function (orderParams) {
-    var json = {
-        service: 'create_direct_pay_by_user',
-        payment_type: '1',
-        _input_charset: basicConfig._input_charset,
-        notify_url: basicConfig.notify_url,
-        partner: basicConfig.partner,
-        return_url: basicConfig.return_url,
-        seller_email: basicConfig.seller_email
-    };
-    Object.assign(json, orderParams);
-    //加入签名结果与签名方式
-    json.sign = buildSign(json);
-    json.sign_type = basicConfig.sign_type;
-    return basicConfig.alipay_gateway + querystring.stringify(json);
-};
-
-/**
- * 验证来自支付宝的通知是否合法
- * @param params 来自支付宝的通知参数
- * @returns {Promise} 验证通过时resolve,失败时reject
- */
-// exports.verify = function (params) {
-//     return new Promise(function (resolve, reject) {
-//         var paramsSign = params.sign;
-//         var realSign = buildSign(params);
-//         if (paramsSign === realSign) {
-//             var url = basicConfig.alipay_gateway +
-//                 querystring.stringify({
-//                     service: 'notify_verify',
-//                     partner: basicConfig.partner,
-//                     notify_id: params['notify_id']
-//                 });
-//             httpsGET(url).then(function (data) {
-//                 if (data.toString() === 'true') {
-//                     resolve(true);
-//                 } else {
-//                     reject('来自alipay接口的结果为:验证结果不合法');
-//                 }
-//             }).catch(function (err) {
-//                 reject('请求alipay接口发生网络错误:' + JSON.stringify(err))
-//             });
-//         } else {
-//             reject('sign验证不相等: ' + paramsSign + ' !== ' + realSign);
-//         }
-//     });
-// };

+ 201 - 0
main.js

@@ -0,0 +1,201 @@
+const axios = require('axios'),
+    crypto = require('crypto'),
+    path = require('path'),
+    fs = require('fs'),
+    qs = require('querystring'),
+    urlencode = require('urlencode'),
+    iconv = require('iconv-lite'),
+    qr = require('qr-image'),
+    express = require('express'),
+    app = express()
+
+const sandbox = fs.readFileSync(path.resolve(__dirname, './sandbox_iobox_private.pem')).toString()
+
+const format = (fmt = 'yyyy-MM-dd hh:mm:ss') => {
+    let date = new Date()
+    var o = {
+        "M+": date.getMonth() + 1, //月份
+        "d+": date.getDate(), //日
+        "h+": date.getHours(), //小时
+        "m+": date.getMinutes(), //分
+        "s+": date.getSeconds(), //秒
+        "q+": Math.floor((date.getMonth() + 3) / 3), //季度
+        "S": date.getMilliseconds() //毫秒
+    };
+    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
+    for (var k in o)
+        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+    return fmt;
+}
+
+const time = format()
+
+const userconfig = {
+	app_id: "2016032301234394",
+	version: "1.0",
+	format: "json",
+	sign_type: "RSA2",
+	method: "alipay.system.oauth.token",
+	timestamp: time,
+	auth_token: null,
+	alipay_sdk: "alipay-sdk-php-20161101",
+	terminal_type: null,
+	terminal_info: null,
+	prod_code: null,
+	notify_url: null,
+	charset: "utf-8",
+    app_auth_token: null,
+    grant_type: 'authorization_code',
+    code: '',
+}
+
+const test = {
+    alipay_sdk: 'alipay-sdk-php-20161101',
+    app_id: '2016032301234394',
+    charset: 'utf-8',
+    code: '',
+    format: 'json',
+    grant_type: 'authorization_code',
+    method: 'alipay.system.oauth.token',
+    sign_type: 'RSA2',
+    timestamp: time,
+    version: '1.0'
+}
+
+/**
+ * 生成签名
+ * @param   {String} content     签名内容
+ * @param   {String} privateKey  私钥
+ * @returns {String} 
+ */
+
+const getSign = (content, privateKey = sandbox) => {
+    let data = crypto.createSign('RSA-SHA256').update(content).sign(privateKey,'base64')
+    return urlencode(data)
+}
+
+const splice = (msg) => {
+    let data = ''
+    for (var prop in msg) {
+        data += prop + '=' + msg[prop] + '&'
+    }
+    return data.substr(0,data.length-1)
+}
+
+const requester = async (url) => {
+    try {
+        let {data, status} = await axios({
+            url: url,
+            method: 'get',
+            headers: {
+                'content-type': 'application/x-www-form-urlencoded'
+            }
+        })
+        if (status === 200) {
+            return data
+        }
+    } catch(e) {
+        console.log(e)
+    }
+}
+
+const out = {
+    alipay_sdk: 'alipay-sdk-php-20161101',
+    app_id: '2016032301234394',
+    biz_content: '',
+    charset: 'utf-8',
+    format: 'json',
+    method: 'alipay.trade.create',
+    sign_type: 'RSA2',
+    timestamp: time,
+    version: '1.0',
+}
+
+const outreq = {
+    app_id: '2016032301234394',
+    version: '1.0',
+    format: 'json',
+    sign_type: 'RSA2',
+    method: 'alipay.trade.create',
+    timestamp: time,
+    auth_token: null,
+    alipay_sdk: 'alipay-sdk-php-20161101',
+    terminal_type: null,
+    terminal_info: null,
+    prod_code: null,
+    notify_url: null,
+    charset: 'utf-8',
+    app_auth_token: null,
+}
+
+const requesters = async (userid) => {
+    let tradeno = Date.now().toString()
+    out.biz_content = '{"out_trade_no":"' + tradeno + '","subject":"ceshi","buyer_id":"'+ userid +'","total_amount":"0.01"}'
+    let url = 'https://openapi.alipay.com/gateway.do?' + qs.stringify(outreq) + '&sign=' + getSign(splice(out)) + '&biz_content=' + urlencode(out.biz_content)
+    let data = await requester(url)
+    return data
+}
+
+app.use('/', express.static(__dirname + '/'))
+
+app.get('/qr', (req, res) => {
+    let text = 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=2016032301234394&scope=auth_base&redirect_uri=http://10.3.16.61:8000/'
+    let img = qr.image(text ,{size :10});
+    res.writeHead(200, {'Content-Type': 'image/png'});
+    img.pipe(res);
+})
+
+app.get('/token', async (req, res) => {
+    userconfig.code = req.query.auth_code
+    test.code = req.query.auth_code
+    let url = 'https://openapi.alipay.com/gateway.do?' + qs.stringify(userconfig) + '&sign=' + getSign(splice(test))
+    let data = await requester(url)
+    let trade = await requesters(data.alipay_system_oauth_token_response.user_id)
+    res.send(trade.alipay_trade_create_response.trade_no)
+})
+
+const sigtrader = {
+    alipay_sdk: 'alipay-sdk-php-20161101',
+    app_id: '2016032301234394',
+    biz_content: '{"trade_no":"2018062021001004450535911615"}',
+    charset: 'utf-8',
+    format: 'json',
+    method: 'alipay.trade.query',
+    sign_type: 'RSA2',
+    timestamp: time,
+    version: '1.0',
+}
+
+const reqtrader = {
+    app_id: '2016032301234394',
+    version: '1.0',
+    format: 'json',
+    sign_type: 'RSA2',
+    method: 'alipay.trade.query',
+    timestamp: time,
+    auth_token: null,
+    alipay_sdk: 'alipay-sdk-php-20161101',
+    terminal_type: null,
+    terminal_info: null,
+    prod_code: null,
+    notify_url: null,
+    charset: 'utf-8',
+    app_auth_token: null,
+}
+
+const trade = async (msg) => {
+    sigtrader.biz_content = '{"trade_no":"' + msg + '"}'
+    let url = 'https://openapi.alipay.com/gateway.do?' + qs.stringify(reqtrader) + '&sign=' + getSign(splice(sigtrader)) + '&biz_content=' + urlencode(sigtrader.biz_content)
+    let data = await requester(url)
+    return data
+}
+
+app.get('/trade', async (req, res) => {
+    let older = req.query.older
+    let data = await trade(older)
+    res.send(data.alipay_trade_query_response)
+})
+
+app.listen('8000', () => {
+    console.log('server start')
+})

+ 12 - 12
package.json

@@ -1,22 +1,22 @@
 {
-  "name": "cloudsql-alipay",
+  "name": "alipay",
   "version": "1.0.0",
-  "description": "alipay",
-  "main": "index.js",
-  "directories": {
-    "test": "test"
-  },
+  "description": "new alipay",
+  "main": "main.js",
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1"
   },
-  "repository": {
-    "type": "git",
-    "url": "http://git.1473.cn/kangna/cloudsql-alipay.git"
-  },
   "author": "kangna",
   "license": "ISC",
   "dependencies": {
-    "body-parser": "^1.18.2",
-    "express": "^4.16.3"
+    "ali-pay": "0.0.3",
+    "alipay-mobile": "^2.2.3",
+    "alipay-node-sdk": "^1.1.8",
+    "alipay-request": "^1.0.1",
+    "alipay-sdk": "^3.0.0",
+    "axios": "^0.18.0",
+    "express": "^4.16.3",
+    "qr-image": "^3.2.0",
+    "urlencode": "^1.1.0"
   }
 }

+ 9 - 0
sandbox_ali_public.pem

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA03SwrXiojtQATxFyKHqq
+5T5mCf58uvTezy40UWn0UwXT8ZJUUp1fG8gTJsWLqa+kvAvvVX/xKDiScrrVE/bE
+ki9QlS4uT5Fj50R4AlEwISc0VkjFkK3Dkj9xfaG4z4rWoaVP0ENOEv/+BZ9Ed/wE
+btcGYDz3T/vb6JVTGSyWo8gsNPQuOuOzFi5iyJo4ue4FqkZX2NntMJCEI/0Sj7df
+tb+lBIvWFPG8qhMk5fA1hIu85FgZm0NkFPa4ae6oY66Vqku86W/B2fstqADkvG1a
+bF4/2/V9xQJ9naaDG4IcOK1s2Wy8CbUUdAfELVdULKyrmhU5fx59nDFRdMtMwQRN
+2QIDAQAB
+-----END PUBLIC KEY-----

+ 27 - 0
sandbox_iobox_private.pem

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAnn7A42jwWslo2AKOf11KYvHyZinl0ANk7xu0DpRbAksjxKwe
+ir93rfwIrJGPF2N6bsXmITbxu1ZF6SRkxf8x7fQ2/E6Nmvewty9ynxy85e3rUJYP
+M/dc5vORzO9QNwBDByp3fJvj9erO1xVjXFoZSyyFBPySSvcwhmkLrAvJmXQDWtjU
+0NZYobNmWbrFUeWlRa+/DAvJBC7/p76EsFH4RtqGLpY/R4ZzqmGE52BZV0/2gZCw
+2gCwSSktXUQM2ZQkIgH0/hIM4X1O0Gfczsygh9UNWYWq8xXFtzPEZ5wCCmdgKu6f
+OEcVVfcKH4IRUvIC0BIzTK/Yz8YoQt79+7VF9QIDAQABAoIBAAfsNiAoArvHDaKe
+nhjnxOwlRASvW3mGcekx7VI9QD9hGiyenfg5kfX0f0qBDDITGu+mnNZUNMk0itIY
+q6DqHMjUSFtcYd+5OfAuQwCJIzgrKHQizCfA2bgBvOwNmmjlbnRRPx/Pexmz3xsJ
+Sqo3JsSHOS8CoR12NcrCPX8gJ7ev7MeLZXHKodmANrIUuYzvAsVypnrXePc4TLdL
+ATLzNCeYicMMBztRFuKyP9kFtte9d5mtIQAjfQYFkNOJttVYDWtSm7QAYJQ/8mac
+i/YNEJyoA8uM6OAU6HnRUbEoJM078z906Ed2kdmivoozhNyHTZelRuClBzvgeWWJ
+4xrUG5ECgYEAynjApiXlB4JOYVGvozY9s51MY2FgZxfMVtakHlXzno0G46Ksr8iM
+8QJ+lDKGX6c9Ase6f8oQKNwMgPjHqbkkHp6M0D5dNpfzGrNqBq563NkE9H3aGU3n
+x32TsE4jgdE+fHO2MS8FzckZTOYyszpwGyAFNIHZ818rjR/mBbP8ZPMCgYEAyGWs
+5C6IAbfFRx5IHUovoAodCLelJWLAv/qylgZBCczW95mGm7zW9HNI9DOiqO3wnsWo
+WKkQUiuUyvBSURIlaZY1xEV7lxkMp0EFIyEtTCTq8YHn3OYOYRlKKIk6xTHpZhs7
+k4Qv/DQMTJ9ckarHwaKyxrDmKOK3k3o8v6Xeg3cCgYEAxIycV64Ju1RfylGF8ybA
+lxBoC0GIWAveLZ6IC3rc2FmHCovsn2hMidomDq9NiqXKsFw7S7pYHZIgAUOAb95u
+ldrMT4t66XhwYscwcfQHCUUTblSN2GqsShg5urjf9zGtOxsJDo3bUH2bte7x4NMl
+6O8YnnQ/o+YLXSBOJ9MlfMkCgYEAtZX0URuc4DmeiG/3FptXhmRDpNeLzNGsKQnI
+80qdenzjuZ6jK9G00fL5A1caqIpbA/PFNPmVMXAONsoHPTD9N60F8WCoueTX42J2
+fjuc6Sd2wPpemHraQsAAw7R9zZwJix1YIbahKJ4dGv04i0I+GccMyiAXnqq5f+g+
+zcZGV8cCgYEAiuvC8lWkvPOELjPl9ecyz8E8TXxcNkY/h/He/Vf0Pc4klhhLDbOw
+08SPcblKews7Wj9NiT0CbcsanO/W5l+JLSY1NAuJXd5blQG2wySKvLHt4nJ0Maiu
+ZukdpXUGQPSqk7yUZYKbqgEazcfj228rVL41fyBMm56GIejQVgSXi0g=
+-----END RSA PRIVATE KEY-----

+ 0 - 48
test/app.js

@@ -1,48 +0,0 @@
-var express = require('express');
-var bodyParser = require('body-parser');
-var alipay = require('../index');
-var app = express();
-
-/**
- * seller_email 支付宝账号
- * partner 合作者id
- * key 支付安全签名
- * return_url 支付成功返回页面
- */
-alipay.config({
-    seller_email: '121889866@qq.com',
-    partner: '2088102565988752',
-    key: 'vrabpv2qbyrz3o6uhby9xtepp12b80xa',
-    // return_url: 'http://127.0.0.1:3000/return'
-});
-
-// index.html
-app.get('/', function (req, res) {
-    res.sendFile(__dirname + '/index.html');
-});
-
-app.use(bodyParser.urlencoded({ extended: false }));
-app.post('/', function (req, res) {
-    var params = req.body;
-    // 业务侧需要为每个订单生成一个唯一订单号
-    params.out_trade_no = Date.now().toString() + Math.random();
-    var url = alipay.buildDirectPayURL(params);
-    res.redirect(url);
-});
-
-// app.get('/return', function (req, res) {
-//     var params = req.query;
-//     alipay.verify(params, function (err, result) {
-//         if (err) {
-//             console.error(err);
-//         } else {
-//             if (result === true) {
-//                 res.reply('支付成功');
-//                 //该通知是来自支付宝的合法通知
-//             }
-//         }
-//     });
-//     res.end('');
-// });
-
-app.listen(3000);

+ 0 - 31
test/index.html

@@ -1,31 +0,0 @@
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <title>支付宝即时到帐接口</title>
-</head>
-<style type="text/css">
-	.paybtn {
-		width: 100px;
-		border: 1px solid #000000;
-		text-align: center;
-		padding: 10px;
-		float: left;
-		margin: 10px;
-		cursor: pointer;
-	}
-	.paybtn:active {
-		border: 2px solid #000000;
-	}
-</style>
-<body>
-<form action="/" method="post">
-    <input type="text" name="subject" placeholder="标题"/>
-    <input type="text" name="body" placeholder="备注">
-    <input type="text" name="total_fee" placeholder="付款金额"/>
-    <input type="submit" value="确认付款">
-</form>
-<h2>选择支付方式</h2>
-<div class="paybtn">支付宝</div>
-<div class="paybtn">微信</div>
-</body>
-</html>