Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

阿里云,AWS,HTTPS和企业支付宝配置 #37

Open
Wscats opened this issue Apr 13, 2018 · 1 comment
Open

阿里云,AWS,HTTPS和企业支付宝配置 #37

Wscats opened this issue Apr 13, 2018 · 1 comment

Comments

@Wscats
Copy link
Owner

Wscats commented Apr 13, 2018

申请证书

  • 登录:阿里云控制台,产品与服务,证书服务,购买证书。
  • 购买:证书类型选择 免费型DV SSL,然后完成购买。

要来回点击寻找一下,因为免费版隐藏了

image

配置

等待阿里云签发成功,然后在右边栏目里面选择下载

这里写图片描述

安装证书

文件说明:

  1. 证书文件1523928142501.pem,包含两段内容,请不要删除任何一段内容。
  2. 如果是证书系统创建的CSR,还包含:证书私钥文件1523928142501.key、证书公钥文件public.pem、证书链文件chain.pem。
    ( 1 ) 在Apache的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为1523928142501.key;
    ( 2 ) 打开 apache 安装目录下 conf 目录中的 httpd.conf 文件,找到以下内容并去掉“#”:
#LoadModule ssl_module modules/mod_ssl.so (如果找不到请确认是否编译过 openssl 插件)
#Include conf/extra/httpd-ssl.conf

( 3 ) 打开 apache 安装目录下 conf/extra/httpd-ssl.conf 文件 (也可能是conf.d/ssl.conf,与操作系统及安装方式有关), 在配置文件中查找以下配置语句:

# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 证书公钥配置
SSLCertificateFile cert/public.pem
# 证书私钥配置
SSLCertificateKeyFile cert/1523928142501.key
# 证书链配置,如果该属性开头有 '#'字符,请删除掉
SSLCertificateChainFile cert/chain.pem

( 4 ) 重启 Apache。
( 5 ) 通过 https 方式访问您的站点,测试站点证书的安装配置,如遇到证书不信任问题

这里注意如果使用阿里云还要在安全组规则里面设置443端口的出入方向

Apache反向代理设置https

因为我是用express框架写的后端,apache默认占了80端口,express可以通过反向代理来享用80端口

首先在 httpd.conf 启用必要的模块,也就是如果去掉下面这几行前面的 #

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Include conf/extra/httpd-ssl.conf

httpd.conf 末端添加如下设置,注意 ProxyPassProxyPassReverse 设置为express框架暴露的端口,并且设置好 SSLCertificateFileSSLCertificateKeyFile 的路径,路径就是上面安装证书步骤里面的路径

<VirtualHost *:80>
	ServerAdmin www.smms.ink
	ServerName www.smms.ink
	ProxyRequests Off
	<Proxy *>
	Order deny,allow
	Allow from all
	</Proxy>
	ProxyPass / http://127.0.0.1:1314/
	ProxyPassReverse / http://127.0.0.1:1314/
</VirtualHost>

<virtualhost *:443>
	ServerName www.smms.ink
	<proxy>
	Order deny,allow
	Allow from all
	</proxy>
	SSLEngine On
	SSLProxyEngine On
	SSLProxyVerify none
	SSLProxyCheckPeerCN off
	SSLProxyCheckPeerName off
	SSLCertificateFile cert/public.pem
	SSLCertificateKeyFile cert/1523928142501.key
	 
	ProxyRequests Off
	ProxyPreserveHost On
	 
	ProxyPass / http://127.0.0.1:1314/
	ProxyPassReverse / http://127.0.0.1:1314/
</virtualhost>

此时当我们访问 https://www.xxx.com 就等于 访问到内网的 http://127.0.0.1:1314
这样对 https://www.xxx.com 的访问,返回的数据将是来自 http://127.0.0.1:1314

上面的这个配置思路总结为如下三步:

  1. 正常启动express项目在1314端口
  2. 然后用apache服务器实现反向代理
  3. 再用apache配置https

Apache和node共享端口

参考文档Apache和nodejs公用80端口的问题

思路是通过不同域名来区分进去是apache解析还是node解析文件,可以利用二级域名来划分

ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
/ 映射到  http://127.0.0.1:9000/

你可以根据自己的路由规则来实现不用的需求,例如:

ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/

ProxyPass /nodejs http://127.0.0.1:1314
ProxyPassReverse /nodejs http://127.0.0.1:1314

此时我们可以根据不同的二级路由进入内网的不同端口,拨入我们可以把/nodejs分配给node开的1314端口,那么外网就可以通过https://xxx/nodejs/xxx进入到nodejs的服务器中,对应如果是其他路由就会进入到apache服务器中

企业支付宝接入

接入之前建议先看官方文档比较详细

创建应用

首先有企业支付宝账号,登录企业支付宝管理中心,登录不知道是不是安全校验太频繁,官网输入登录的时候特别卡特别慢,进入开发者中心,因为我选择的是网页&移动应用,要提供网址通过审核,审核通过就会出现下面的已上线应用

image

配置RSA密钥

下载官网中的RSA签名验签工具配置RSA2密钥,会生成应用公钥应用密钥,注意上面选择中有JAVA适用非JAVA适用的选项,因为我后端选择PHP所以我选择了非JAVA适用的PKCS1

image

应用公钥上传应用信息中的开发配置中,还有开发配置中的应用网关不是必填项,可以选择不填,然后将旁边的支付宝密钥复制到后端的SDK中的config.php中alipay_public_key字段后,注意应用公钥是跟支付宝密钥完全不同的,不要弄错,不然一会儿验签会失败

image

配置服务器

下载对应的SDK文件手机网站支付DEMO,这里根据对应的需求进行下载,有对应不同后端语言的,我下载的手机网站支付是有包含完整前后端的逻辑的DEMO

一般来说最简单的测试只需要配置config.php文件就可以了

<?php
$config = array (	
	//应用ID,您的APPID。
	'app_id' => "xxxx",

	//商户私钥,您的原始格式RSA私钥,也就是应用私钥
	'merchant_private_key' => "xxxx",
		
	//异步通知地址
	//这里最好用http 支付宝的异步的回调在免费https证书下会失败
	'notify_url' => "http://工程公网访问地址/alipay.trade.wap.pay-PHP-UTF-8/notify_url.php",
		
	//同步跳转
	//'return_url' => "http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php",
		
	//编码格式
	'charset' => "UTF-8",

	//签名方式
	'sign_type'=>"RSA2",

	//支付宝网关
	'gatewayUrl' => "https://openapi.alipay.com/gateway.do",

	//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm
        //对应APPID下的支付宝公钥。注意是支付宝公钥,而不是应用公钥,支付宝公钥是基于上传的应用公钥生成的
	'alipay_public_key' => "xxxx",
);

这里注意两点支付宝公钥和应用公钥,不要粘贴错,这里需要的是支付宝公钥而不是应用公钥,还有点就是notify_url和return_url

return_url是支付成功后在客户端返回给客户看的回调地址,需要和开发配置中的授权回调地址对应,这是支付宝对支付的一种校验,这个地址建议不要写任何支付后的操作逻辑,因为用户有可能会在客户端切掉看不到而影响逻辑判断

image

notify_url是支付成功后支付宝通知给服务端的回调地址,这个地址注意要在公网可访问,因为支付宝会响应它,所以在本地测试中是不行的,必须上传到公网服务器,还有这里注意的是使用阿里云的免费https证书时候,这里如果地址是https会有一定失败率的,也就是说这里如果用了阿里云的免费https证书最好还是用回http地址响应,如果响应成功会echo出success这7个字符给支付宝,说明验签成功了,所以这个文件不要包含任何html代码,会影响结果输出,我们可以把支付后后端需要执行的逻辑放在这里,比如记录支付成功等

完整的交易逻辑

最重要就是 WIDout_trade_no 商品订单号,自己定义的,当我们发送支付到自己后端时候记录这个订单号,等支付宝验签回来成功后,对比信息中的订单号完成一个完整的支付逻辑,还要注意的是支付宝应该是只能用form表单提交支付请求,因为返回来的是一个form的代码,当然你也可以动态创建form来发送支付请求,但我个人建议还是直接静态form的形式来得方便

APP和网页支付

注意APP和网页都要各自通过签约才可以调用支付接口的,之前在这里浪费了很久时间一直测试都是报ALIN10146错误就是因为忘记还没有APP签约

2018-11-23 11 17 41

APP内支付要真机连接查看返回的参数,注意后台PHP返回给APP的签名是不需要htmlspecialchars,不然这里会帮你把&&amp,这里正确是&,不然APP支付会报ALIN10146

// 注意:这里不需要使用htmlspecialchars进行转义,直接返回即可
echo $response;
//echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
@Wscats Wscats changed the title 阿里云配置https 阿里云配置https和企业支付宝配置 Apr 21, 2018
@Wscats Wscats changed the title 阿里云配置https和企业支付宝配置 阿里云和AWS配置,https和企业支付宝配置 Feb 27, 2019
@Wscats Wscats changed the title 阿里云和AWS配置,https和企业支付宝配置 阿里云和AWS配置,HTTPS和企业支付宝配置 Feb 27, 2019
@Wscats
Copy link
Owner Author

Wscats commented Feb 27, 2019

AWS

亚马逊云服务器官网
可以把在本地ssh-keygen命令生成的Githubssh私钥上传上去,然后在创建服务器时候使用密钥对来生成钥匙,然后使用microsoft remote desktop for mac进行连接,可以导入rtp文件,配合本地的公钥来进行解析密码登录

@Wscats Wscats changed the title 阿里云和AWS配置,HTTPS和企业支付宝配置 阿里云,AWS,HTTPS和企业支付宝配置 Aug 31, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant