也说借钱

在经济和生活当中,有一个东西肯定扮演者重要角色–钱。因为钱,我们总能认清身边的人,借钱见人心,还钱见人品。

只要是个人,难免会急着用钱(除非你家真是有钱人,但那也不一定是你的)。以前还可能没办法,只能死气八咧地找朋友借钱,毕竟实在掰不开嘴跟家里人要。现在不一样了,只要你稍稍有份工作,你可以办几张张信用,因为你多半了几张,银行给你的额度还可能更高了。

但是,人嘛总是想着贪着点小便宜,尽管人家有支付宝的花呗和借呗,有好几张额度不低的信用卡,有微信的微粒贷借钱。对不起,这些都要利息,而且还有还款期限,但是有了朋友你就不同了,我找你借,多多少少也要给点吧,借的少可能还不用还了,多借点也不用急着还,什么利息,你说啥,那是友谊来的好不好。我自己还有几万块的大学贷款没还呢,你很清楚的,但是你还是义不容辞的找我借,没事嘛,一万块我借不了给你,我给你一千,叫你不用还了。你倒好,钱拿了之后一个微信消息也不回了。行吧,也就这样。

没有谁是应该帮助你的人,愿意帮你,只是把你当做真正的朋友。不要因为钱,让自己变得虚伪,不要因为钱,让自己失去一个信任自己的人。

nginx中配置跨域支持功能

在nginx.conf中配置

http {

......

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Headers X-Requested-With;

add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

......

}

这样就可以实现GET,POST,OPTIONS的跨域请求的支持
也可以 add_header Access-Control-Allow-Origin https://dreamus.net –指定允许的url;

thinkphp之PHPExcel生成Excel表格文件

开始整合 ThinkPHP 功能了,先把这两个导出 Excel 表的功能提交上去,项目地址: Github

昨天发 csv 格式的时候就说 PHPExcel 导出没有表头的问题,昨天研究了一下搞出来了

第一步:导入 phpexcel

从官网下载或者从我的项目中拉取,路径是 /ThinkPHP/Library/Vendor/PHPExcel ,从官网下载的话也是放在这个路径下面

第二步:封装函数

/**
 * 数组转 xls 格式的 excel 文件
 * @param  array  $data      需要生成 excel 文件的数组
 * @param  string $filename  生成的 excel 文件名
 *      示例数据:
        $data = array(
            array(NULL, 2010, 2011, 2012),
            array('Q1',   10,   11,   12),
            array('Q2',   20,   21,   22),
            array('Q3',   30,   31,   32),
            array('Q4',   40,   41,    42),
           );
 */
function createXls($data, $filename='simple.xls'){
    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');

    $filename=str_replace('.xls', '', $filename).'.xls';

    $phpexcel = new PHPExcel();
    $phpexcel->getProperties()
//      右键属性所显示的信息
        ->setCreator("By ShenYan") //作者
        ->setLastModifiedBy("By ShenYan") //最后一次保存者
        ->setTitle("excel")//标题
        ->setSubject("excel")//主题
        ->setDescription("excel")//描述
        ->setKeywords("excel php") //标记
        ->setCategory("result file"); //类别
    $phpexcel->getActiveSheet()->fromArray($data);
    $phpexcel->getActiveSheet()->setTitle('Sheet1');
    $phpexcel->setActiveSheetIndex(0);

    header('Content-Type: application/vnd.ms-excel');
    header("Content-Disposition: attachment;filename=$filename");
    header('Cache-Control: max-age=0');
    header('Cache-Control: max-age=1');
    header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
    header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
    header ('Pragma: public'); // HTTP/1.0

    $objwriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5');
    $objwriter->save('php://output');

    exit;
}

解释一下这个 PHP 的 max_execution_time 参数

php.ini 中缺省的最长执行时间是 30 秒,这是由 php.ini 中的 max_execution_time 变量指定

如果有一个需要很多时间才能完成的工作,比如发群发邮件、导出 Excel,或者进行数据分析工作,服务器会在 30 秒后强行中止正在执行的程序

最简单就是直接修改 php.ini 中 max_execution_time 的数值,但是这样直接修改 php.ini 的话,服务器上的 php.ini 可能会有很多网站共同使用,所以不能随意修改

另一个办法是在程序中加入 ini_set('max_execution_time', '0') ,数值 0 表示没有执行时间的限制,你的程序需要跑多久就是跑多久,但是在生产环境的话推荐把时限设置一个实数,以免程序的错误把服务器宕掉

第三步:调用

public function excelDemo(){
    $header = array(
        array(NULL, 沈唁, 集成, Excel)
    );
    $orderinfo = array(
        array(1,2,3,4),
        array(5,6,7,8),
        array(1,3,5,7)
    );
    $data = array_merge($header,$orderinfo);
    createXls($data);
}

直接使用的话是没有表头的,所以使用 array_merge 这个函数,将数组进行合并,就可以将上面的数组当做表头来使用了,做法很简单

原文链接:http://www.jianshu.com/p/fba5e1a012cb

php 配置 xdebug进行调试

首先,查看自身配置

下载对应版本

https://xdebug.org/download.php

 

将其放置到对应文件夹下,并在php.ini中配置如下参数

[xdebug]
zend_extension =”D:/xampp/php/ext/php_xdebug-2.5.5-5.6-vc11.dll”
xdebug.remote_enable = On
;启用性能检测分析
xdebug.profiler_enable = On
;启用代码自动跟踪
xdebug.auto_trace=On
xdebug.profiler_enable_trigger = On
xdebug.profiler_output_name = cachegrind.out.%t.%p
;指定性能分析文件的存放目录
xdebug.profiler_output_dir =”D:/xampp/tmp”
xdebug.show_local_vars=0

;配置端口和监听的域名
xdebug.remote_port=9000
xdebug.remote_host=”localhost”

到此为止,人比较帅的一般都能搞定了

(转)PHP程序员进阶学习书籍参考指南

【初阶】(基础知识及入门)
01. 《PHP与MySQL程序设计(第4版)》  http://item.jd.com/10701892.html
02. 《深入浅出MySQL 数据库开发 优化与管理维护 第2版》 http://item.jd.com/11381295.html
03. 《实战Nginx:取代Apache的高性能Web服务器》 http://dwz.cn/2K1ryn
04. 《Redis 实战》 http://item.jd.com/11791607.html
06. 《MongoDB权威指南 第2版》 http://item.jd.com/11384782.html
07. 《Linux系统命令及Shell脚本实践指南》 http://item.jd.com/11354663.html
【中阶】(基本系统知识相关,可阅读类似书籍)
01. 《图解HTTP》 http://item.jd.com/11449491.html
02. 《图解TCP/IP 第5版》 http://item.jd.com/11253710.html
03. 《大话设计模式》 http://item.jd.com/10079261.html
04. 《大话数据结构》 http://item.jd.com/10663703.html
05. 《编译原理(第2版)》 http://item.jd.com/10058776.html
06. 《Linux C 编程一站式学习》 http://dwz.cn/2K1C3n
07. 《PHP应用程序安全编程》 http://dwz.cn/2K317p
08. 《高性能PHP应用开发》  http://dwz.cn/2K1kcy

09. 《PHP核心技术与最佳实践》 http://item.jd.com/11123177.html

10. 《高性能MySQL(第3版)》 http://item.jd.com/11220393.html
11. 《深入理解MariaDB与MySQL》  http://item.jd.com/11835700.html
12. 《构建高可用Linux服务器(第3版)》 http://item.jd.com/11557939.html
【中高阶】(深入理解系统)
1. 《深入理解计算机系统(原书第2版)》 http://item.jd.com/10360906.html
2. 《现代操作系统(原书第3版)》  http://item.jd.com/10058893.html
3. 《数据库系统概念(原书第6版)》 http://item.jd.com/10954261.html
4. 《数据库系统实现(第2版)》 http://item.jd.com/10060181.html
5. 《UNIX环境高级编程(第3版)》 http://item.jd.com/11469694.html
6. 《UNIX网络编程 卷1 套接字联网API(第3版)》 http://item.jd.com/11728741.html
7. 《Linux高性能服务器编程》 http://item.jd.com/11252777.html
【高阶】(深入理解服务原理)
01. 《深入理解PHP内核》 http://www.php-internals.com/book/
02. 《深入理解MySQL》 http://item.jd.com/10063042.html
03. 《MySQL技术内幕:InnoDB存储引擎(第2版)》 http://item.jd.com/11252326.html
04. 《深入剖析Nginx》 http://item.jd.com/11226514.html
05. 《深入理解Nginx:模块开发与架构解析》 http://item.jd.com/11217076.html
06. 《Redis设计与实现》 http://item.jd.com/11486101.html
【架构及升级】(Web架构、分布式、云计算、机器学习等方向)
01. 《大规模Web服务开发技术》 http://dwz.cn/2K2o1d
02. 《大型分布式网站架构设计与实践》 http://item.jd.com/11529266.html
03. 《大型网站技术架构 核心原理与案例分析》 http://item.jd.com/11322972.html
04. 《大规模分布式系统架构与设计实战》 http://item.jd.com/11417660.html
05. 《大规模分布式存储系统:原理解析与架构实战》 http://item.jd.com/11310547.html
06. 《分布式系统:概念与设计(原书第5版)》 http://item.jd.com/11194499.html
07. 《Hadoop权威指南(第3版 修订版)》 http://item.jd.com/11566298.html
08. 《Cassandra权威指南》 http://item.jd.com/10794341.html
09. 《云计算架构技术与实践》 http://item.jd.com/11537731.html
10. 《OpenStack开源云王者归来》 http://item.jd.com/11521443.html
11. 《数据挖掘 概念与技术(原书第3版)》 http://item.jd.com/11056660.html
12. 《机器学习》 http://item.jd.com/10131321.html
13. 《图解机器学习》 http://item.jd.com/11676112.html
14. 《机器学习实战》 http://item.jd.com/11242112.html
【番外篇】(可以参考延展学习)
01. 《深入PHP:面向对象、模式与实践(第3版)》 http://item.jd.com/10794350.html
02. 《Linux网络编程(第2版)》 http://item.jd.com/11397772.html
03. 《Linux多线程服务端编程 使用muduo C++网络库》 http://item.jd.com/11163782.html
04. 《Linux运维之道》 http://item.jd.com/11375254.html
05. 《Linux性能优化大师》 http://item.jd.com/11734651.html
06. 《PostgreSQL修炼之道:从小工到专家》 http://item.jd.com/11684063.html
07. 《图解网络硬件》 http://item.jd.com/11506709.html
08. 《网络安全基础:网络攻防、协议与安全》 http://item.jd.com/10550797.html
09. 《密码学原理与实践(第3版)》 http://item.jd.com/10067358.html
10. 《黑客大曝光:网络安全机密与解决方案(第7版)》 http://item.jd.com/11307435.html
11. 《黑客攻防技术宝典 Web实战篇 第2版》 http://item.jd.com/11020022.html
12. 《精通正则表达式(第3版)》 http://item.jd.com/11070361.html
13. 《Go语言编程》 http://item.jd.com/11067810.html
14. 《Python基础教程(第2版 修订版)》 http://item.jd.com/11461683.html
15. 《快学Scala》 http://item.jd.com/11113845.html
16. 《Erlang/OTP并发编程实战》 http://item.jd.com/11037265.html
17. 《函数式编程思维》 http://item.jd.com/11763847.html
18. 《Android从入门到精通》 http://item.jd.com/11078112.html
19. 《iOS开发指南》 http://item.jd.com/11681585.html
20. 《搜索引擎:信息检索实践》 http://item.jd.com/10059723.html
21. 《统计自然语言处理(第2版)》 http://item.jd.com/11314362.html
22. 《这就是搜索引擎:核心技术详解》 http://item.jd.com/10893803.html
23. 《Elasticsearch服务器开发(第2版)》 http://item.jd.com/11615450.html
24. 《实战Elasticsearch、Logstash、Kibana》 http://item.jd.com/11706768.html

25. 《推荐系统实践》 http://item.jd.com/11007625.html

26. 《机器学习实践指南:案例应用解析》 http://item.jd.com/11447036.html
27. 《Hadoop实战(第2版)》 http://item.jd.com/11116710.html
28. 《Hadoop大数据分析与挖掘实战》 http://item.jd.com/11837003.html
29. 《Spark大数据处理:技术、应用与性能优化》 http://item.jd.com/11577088.html
30. 《Spark机器学习》 http://item.jd.com/11763016.html

LNMP 配置NGINX 支持thinkphp5的PATHINFO模式

1,修改PHP.INI 支持 PHPINOF

PHP配置文件:/usr/local/php/etc/php.ini

更改php.ini
找到:cgi.fix_pathinfo=0
更改为:cgi.fix_pathinfo=1

2.修改nginx对应配置文件

/usr/local/nginx/conf/vhost/你的域名配置文件

server {
listen 80;
server_name www.dreamus.net;
root /your project/public;
index index.php index.html index.htm;

#error_page 404 /404.html;
location ~* ^.+.(jpg|jpeg|gif|css|png|js|thumb) {
expires 30d;
}
location / {
try_files $uri @default;
}

location @default {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root/index.php;
include fastcgi_params;
}

location ~ \.php($|/) {
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_split_path_info ^(.+?\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
}

}

3.重启lnmp即可。

service nginx restart

打开对应的网站输入路由即可   https://your domain/api/v1/banner/1a

git 常用操作

1 查看文件更改状态
git status

2 加入 git
git add .

3 为上传的代码加备注
git commit -m ‘备注内容’

4 上传到github 码云等源码库
git push (origin/master)

5 代码更新到本地
git fetch –all
git reset –hard origin/master

加餐:

1.git init //初始化git
2.git clone (git远程URL) (本地路径) //拷贝远程git的文件
3.git branch //查看本地分支
4.git branch -a //查看远程git分支
5.git branch (名) //本地创建分支
6.git add (文件名称) 或者 .(代表全部文件)
9.git status //检查修改的文件名
7.git commit -m 提交到存储库
8.git push origin (本地分支名):(远程分支名) //本地修改文件提交到远程分支上
9.git pull origin (远程分支名) //同步
10.git log 命令用于显示提交日志信息
11.git reset –hard (版本号) //版本号commit,用git log获取commit

nginx将http升级成https

在七牛云(https://www.qiniu.com/)中注册个人或者企业开发人员,然后申请免费版的ssl证书

接着在个人购买的域名服务商中配置TXT域名解析

完成后将下发证书。

接着在nginx 配置文件中加入配置:

listen 443 ssl;
server_name 对应的域名;
index index.html index.htm index.php;
root 虚拟主机配置目录;
ssl_certificate dreamus.net.crt;
ssl_certificate_key dreamus.net.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
完成之后将nginx重启:service nginx restart
这时候就可以看到成果了!

pkill命令

当我们使用xshell,securecrt等工具连接服务器时,是有一定的时间限制的,如果没有在规定的时间内完成操作并退出(logout),则会直接失联,导致服务器上存在多个用户。

此时可以输入命令 who 查看当前登录人情况:

如果有需要,可以删除指定的用户:   pkill -kill -t pts/0    该命令中的 0 指的是第几个用户.

PHP实现qq第三方登录实例

1、接入QQ开放平台的前置条件
1、一个QQ号
2、一台公网可以访问的web服务器(阿里云、百度云、腾讯云)
3、通过备案的域名

2、腾讯QQ_AppIDt和AppKey申请网址
https://connect.qq.com/

3、回调地址常见问题及修改方法
1. 什么是回调地址域名?
用户点击QQ登录跳转到QQ登录页面,登录成功后,应该跳转回网站。回调地址即在这里用来指定跳转回网站的URL。 回调地址注册的目的是为了保障第三方APPID帐户的安全,以免被其他恶意网站盗用。  申请时需注意: 1. 只需要填写站点根域名即可(申请成功后可修改); 2. 如有多个站点同时使用该APPID,可以注册多个根域名,用分号隔开; 3. 具体跳转URL将在程序中指定路径以及请求参数进行构造。
例如:
申请时填写的回调地址是:http://www.023xs.cn/qqlogin.php;http://www.example.com/qqlogin.php
合法的redirect_uri参数可以是:http://bbs.023xs.cn/qqlogin.php?a=1
也可以是:http://www.example.com/qqlogin.php?a=1
但是如果使用:http://www.023.cn/qqlogin.php?a=1 ,请求将会被认为非法,因为该回调地址根域名未被注册过。

2. 回调地址错误的原因有哪些?
回调地址错误,会返回错误码:100010。
回调地址错误的原因如下:(1)没有传入域名;(2)传入的域名与申请接入时填写的回调地址域名冲突。
例如:申请时填写的回调地址是:http://www.023xs.cn,传入的是http://www.023.cn?a=b&c=d, 则会返回错误码。
正确的请求回调地址示例是:http://www.023xs.cn?a=b&c=d,保证填写的回调地址和请求的一致。

4、配置SDK参数(特别注意回调地址的填写)
appid:APP ID

appkey:appkey

callback: example/oauth/callback.php
勾选请求授权列表:get_user_info

5、 SDK核心类和重要方法
1、登录授权相关的三个主要类(API/class/*.class.php)
Recorder.class.php [配置读写与SESSION存取]
URL.class.php [基于CURL库的get与post请求]
Oauth.class.php [Oauth相关URL动态拼接与Token操作]

7、整合SDK到web项目中之请求访问QQ登录页面(login.php)

   <?php
    require_once 'API/qqConnectAPI.php';
    // 访问QQ登录页面
    $oauth = new Oauth();
    $oauth ->qq_login();

 

8、整合SDK到web项目中之获取code、openID和accesstoken(callback.php)

<?php

 require_once 'API/qqConnectAPI.php';

 //echo $_GET['code'];

// 请求accesstoken
$oauth = new Oauth(); // 实例化Oauth()类
$access_token = $oauth ->qq_callback(); // 获取access_token
$openid = $oauth->get_openid();  // 获取openID
// 存入cookie 也可以存入session或者数据库
setcookie('qq_access_token',$access_token,time()+86400);
setcookie('qq_openid',$openid,time()+86400);

header('Location:index.php');

9、API调用示例,获取用户信息(get_user_info)

<?php
require_once 'API/qqConnectAPI.php';
// 传入 qq_access_token 和 qq_openid 获取用户信息
$qc = new QC($_COOKIE['qq_access_token'],$_COOKIE['qq_openid']);
$userinfo = $qc -> get_user_info();
var_dump($userinfo);

 

到了这一步 基本上QQ快速登录已经完成了,把自己想要的数据存入数据库就O了。 ^-^!

出处:小张个人博客 http://023xs.cn/Article/22

您的支持是对博主最大的鼓励,感谢您的认真阅读。欢迎转载,但请保留该声明。

让你的微信小程序具有在线支付功能

需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出一辙,下面我就具体说一下小程序里微信支付的开发流程和注意点。

1.开通微信支付和微信商户号
这个过程就和开通服务号的微信支付过程一样,没有什么可以说的。

2.获得用户的openid
首页我们需要在小程序的客户端js中获取当前用户的openid,通过调用wx.login方法可以得到用户的code,然后开发者服务器使用登录凭证 code 获取 openid。

wx.login({
      success: function(res) {
        if (res.code) {
          //发起网络请求
          wx.request({
            url: 'https://yourwebsit/onLogin',
            method: 'POST',
            data: {
              code: res.code
            },
            success: function(res) {
                var openid = res.data.openid;
            },
            fail: function(err) {
                console.log(err)
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });
var code = req.param("code");
        request({
            url: "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code",
            method: 'GET'
        }, function(err, response, body) {
            if (!err && response.statusCode == 200) {
                res.json(JSON.parse(body));
            }
        });

3.获取prepay_id和支付签名验证paySign
这一步的过程就和服务号里的微信支付过程一样,分为客户端和服务器端
首先来看一下客户端js
在服务号里,我们是通过如下的代码来调起支付功能

function jsApiCall()
        {
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest',
                {
                   "appId":"",     //公众号名称,由商户传入     
                   "timeStamp":"",         //时间戳,自1970年以来的秒数     
                   "nonceStr":"", //随机串     
                   "package":"prepay_id=<%=prepay_id%>",     
                   "signType":"MD5",         //微信签名方式:     
                   "paySign":"<%=_paySignjs%>" //微信签名
                },
                function(res){
                    WeixinJSBridge.log(res.err_msg);
                    if( res.err_msg =="get_brand_wcpay_request:ok"){
                        alert("支付成功!");
                    }else{
                        alert("支付失败!");
                    }
                }
            );
        }

在小程序里,我们是通过wx.requestPayment方法来调起支付功能,当然在这之前,我们先要获取prepay_id。

              wx.request({
                    url: 'https://yourwebsit/service/getPay', 
                    method: 'POST',
                    data: {
                      bookingNo:bookingNo,  /*订单号*/
                      total_fee:total_fee,   /*订单金额*/
                      openid:openid
                    },
                    header: {
                        'content-type': 'application/json'
                    },
                    success: function(res) {
                        wx.requestPayment({
                          'timeStamp':timeStamp,
                          'nonceStr': nonceStr,
                          'package': 'prepay_id='+res.data.prepay_id,
                          'signType': 'MD5',
                          'paySign': res.data._paySignjs,
                          'success':function(res){
                              console.log(res);
                          },
                          'fail':function(res){
                              console.log('fail:'+JSON.stringify(res));
                          }
                        })
                    },
                    fail: function(err) {
                        console.log(err)
                    }
                })

那在服务器端主要要实现的是prepay_id的获取和签名paySign

        var bookingNo = req.param("bookingNo");
        var total_fee = req.param("total_fee");
        var openid = req.param("openid");
        var body = "费用说明";
        var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        var formData = "<xml>";
        formData += "<appid>appid</appid>"; //appid
        formData += "<attach>test</attach>";
        formData += "<body>" + body + "</body>";
        formData += "<mch_id>mch_id</mch_id>"; //商户号
        formData += "<nonce_str>nonce_str</nonce_str>";
        formData += "<notify_url>notify_url</notify_url>";
        formData += "<openid>" + openid + "</openid>";
        formData += "<out_trade_no>" + bookingNo + "</out_trade_no>";
        formData += "<spbill_create_ip>spbill_create_ip</spbill_create_ip>";
        formData += "<total_fee>" + total_fee + "</total_fee>";
        formData += "<trade_type>JSAPI</trade_type>";
        formData += "<sign>" + paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, spbill_create_ip, total_fee, 'JSAPI') + "</sign>";
        formData += "</xml>";
        request({
            url: url,
            method: 'POST',
            body: formData
        }, function(err, response, body) {
            if(!err && response.statusCode == 200) {
                var prepay_id = getXMLNodeValue('prepay_id', body.toString("utf-8"));
                var tmp = prepay_id.split('[');
                var tmp1 = tmp[2].split(']');
                //签名
                var _paySignjs = paysignjs(appid, mch_id, 'prepay_id=' + tmp1[0], 'MD5',timeStamp);
                var o = {
                    prepay_id: tmp1[0],
                    _paySignjs: _paySignjs
                }
                res.send(o);
            }
        });

下面是用到的函数

function paysignjs(appid, nonceStr, package, signType, timeStamp) {
    var ret = {
        appId: appid,
        nonceStr: nonceStr,
        package: package,
        signType: signType,
        timeStamp: timeStamp
    };
    var string = raw1(ret);
    string = string + '&key='+key;
    console.log(string);
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string, 'utf8').digest('hex');
};

function raw1(args) {
    var keys = Object.keys(args);
    keys = keys.sort()
    var newArgs = {};
    keys.forEach(function(key) {
        newArgs[key] = args[key];
    });

    var string = '';
    for(var k in newArgs) {
        string += '&' + k + '=' + newArgs[k];
    }
    string = string.substr(1);
    return string;
};

function paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type) {
    var ret = {
        appid: appid,
        attach: attach,
        body: body,
        mch_id: mch_id,
        nonce_str: nonce_str,
        notify_url: notify_url,
        openid: openid,
        out_trade_no: out_trade_no,
        spbill_create_ip: spbill_create_ip,
        total_fee: total_fee,
        trade_type: trade_type
    };
    var string = raw(ret);
    string = string + '&key='+key;
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string, 'utf8').digest('hex');
};

function raw(args) {
    var keys = Object.keys(args);
    keys = keys.sort()
    var newArgs = {};
    keys.forEach(function(key) {
        newArgs[key.toLowerCase()] = args[key];
    });

    var string = '';
    for(var k in newArgs) {
        string += '&' + k + '=' + newArgs[k];
    }
    string = string.substr(1);
    return string;
};

function getXMLNodeValue(node_name, xml) {
    var tmp = xml.split("<" + node_name + ">");
    var _tmp = tmp[1].split("</" + node_name + ">");
    return _tmp[0];
}

这样简单3步,小程序的微信支付功能就接上了,下面是测试的支付效果图

作者:隔壁陈叔叔
链接:https://www.jianshu.com/p/72f5c1e3f8a5
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。