一、
创建应用
1>
登陆微信开放平台(
https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN&token=024e5186b4199c44bcc6711f789a52f43fcaff23
)
进入管理中心,
![](https://i-blog.csdnimg.cn/blog_migrate/20a81adfa980f3f5e6b7bfda3ca94630.png)
2>
管理中心
/
创建移动应用
![](https://i-blog.csdnimg.cn/blog_migrate/c517484061bab1999c88379543c6fb16.png)
图片按要求上传,否则,上传不上去,上传的图片最好清晰
![](https://i-blog.csdnimg.cn/blog_migrate/9a5ebcb1415db7a5614f227dc542e11f.png)
创建应用时
应用官网
要正确
![](https://i-blog.csdnimg.cn/blog_migrate/a8beeaaf64a16ebb427ec15b14290376.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a8944d0c1e9a16af2925b3ded419a164.png)
之后就等提交审核了,一般在三到四天之内有消息
应用签名的生成方法:
(1)
下载应用签名工具:
签名工具下载地址
https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
下载下来
![](https://i-blog.csdnimg.cn/blog_migrate/82dfa6f3a06445c17c70150124aa2b68.png)
不要解压,更改文件后缀名为.apk
然后安装到手机就行了
(2)
签名工具作用:
根据项目的应用包名和编译使用的
keystore
,可由签名工具生成一个
32
位的
md5
串,在调试的手机上安装签名工具后,运行可生成应用签名串,绿色串即应用签名。
(3)
不要着急着生成签名:
先打包生成release.apk 将
release.apk
安装到手机 然后再用签名工具生成 签名
(5)
![](https://i-blog.csdnimg.cn/blog_migrate/f70025a815a4db0b1de4718332741d84.png)
(6)
这里没设置好的话,后面支付会出现问题,具体问题后面再说
3>
管理中心\应用详情
![](https://i-blog.csdnimg.cn/blog_migrate/9499a5416ad0dfd7322c49c8254cf394.png)
![](https://i-blog.csdnimg.cn/blog_migrate/24c5a14f097d66ca3ae16e4a0aa52471.png)
申请开通
不过这已经是审核通过后的事情了,
![](https://i-blog.csdnimg.cn/blog_migrate/4c4d550753082343875b7ae84479dfea.png)
所以当确定应用有这个功能的时候,应用网址也存在,那么就需要及时申请,不然等到做到这个模块再申请,那调试也就必须等着了
4>
应用审核过后,申请开通支付功能(这里面会支付给微信300大洋),开通后会给商户账户 支付的时候用到的信息就有 商户号 微信分配的公众账号
ID API
密钥,在商户平台设置
![](https://i-blog.csdnimg.cn/blog_migrate/5eb0003d0c1d45974ea87cb1348c6725.png)
商户在微信公众平台
(
申请扫码支付、公众号支付
)
或开放平台
(
申请
APP
支付
)
按照相应提示,申请相应微信支付模式。微信支付工作人员审核资料无误后开通相应的微信支付权限。微信支付申请审核通过后,商户在申请资料填写的邮箱中收取到由微信支付小助手发送的邮件,此邮件包含开发时需要使用的支付账户信息
二、
支付集成
1.
支付(业务)流程图解
以下是交互时序图,统一下单
API
、支付结果通知
API
和查询订单
API
等都涉及签名过程,调用都必须在商户服务器端完成。如图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/a247b24fd33ba38ddb80aa5a0e47d05e.png)
图
8.6 APP
支付时序图
商户系统和微信支付系统主要交互说明:
步骤
1
:用户在商户
APP
中选择商品,提交订单,选择微信支付。
步骤
3
:统一下单接口返回正常的
prepay_id
,再按签名规范重新生成签名后,将数据传输给
APP
。参与签名的字段名为
appid
,
partnerid
,
prepayid
,
noncestr
,
timestamp
,
package
。注意:
package
的值格式为
Sign=WXPay
(
ios必须是这个
)
2.1
支付中术语
支付模式(这里我们要用到app支付)
刷卡支付是用户展示微信钱包内的
“
刷卡条码
/
二维码
”
给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信
“
扫一扫
”
完成支付的模式。该模式适用于
PC
网站支付、实体店单品或订单支付、媒体广告支付等场景。
公众号支付是用户在微信中打开商户的
H5
页面,商户在
H5
页面通过调用微信支付提供的
JSAPI
接口调起微信支付模块完成支付。应用场景有:
◆
用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
◆
用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
◆
将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
APP
支付又称移动端支付,是商户通过在移动端应用
APP
中集成开放
SDK
调起微信支付模块完成支付的模式。
名词解释
1
、微信公众平台
微信公众平台是微信公众账号申请入口和管理后台。商户可以在公众平台提交基本资料、业务资料、财务资料申请开通微信支付功能。
2
、微信开放平台
微信开放平台是商户
APP
接入微信支付开放接口的申请入口,通过此平台可申请微信
APP
支付。
3
、微信商户平台
微信商户平台是微信支付相关的商户功能集合,包括参数配置、支付数据查询与统计、在线退款、代金券或立减优惠运营等功能。
4
、微信支付系统
微信支付系统是指完成微信支付流程中涉及的
API
接口、后台业务处理系统、账务系统、回调通知等系统的总称。
5
、商户收银系统
商户收银系统即商户的
POS
收银系统,是录入商品信息、生成订单、客户支付、打印小票等功能的系统。接入微信支付功能主要涉及到
POS
软件系统的开发和测试,所以在下文中提到的商户收银系统特指
POS
收银软件系统。
6
、商户后台系统
商户后台系统是商户后台处理业务系统的总称,例如:商户网站、收银系统、进销存系统、发货系统、客服系统等。
7
、商户证书
商户证书是微信提供的二进制文件,商户系统发起与微信支付后台服务器通信请求的时候,作为微信支付后台识别商户真实身份的凭据。
8
、签名
商户后台和微信支付后台根据相同的密钥和算法生成一个结果,用于校验双方身份合法性。签名的算法由微信支付制定并公开,常用的签名方式有:
MD5
、
SHA1
、
SHA256
、
HMAC
等。(一般用MD5)
9
、支付密码
支付密码是用户开通微信支付时单独设置的密码,用于确认支付完成交易授权。该密码与微信登录密码不同。
10
、
Openid
用户的身份标识,不同应用拥有不同的
openid
。商户后台系统通过登录授权、支付通知、查询订单等
API
可获取到用户的
openid
。主要用途是判断同一个用户,如果商户有公众号,可以通过获取
unionid
判断同一个用户。
2.2
接口规则
协议规则
商户接入微信支付,调用
API
必须遵循以下规则:
参数规则
1
、
body
字段格式
2
、交易金额
交易金额默认为人民币交易,接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。
外币交易的支付金额精确到币种的最小单位,参数值不能带小数点。
3
、交易类型
JSAPI--
公众号支付、
NATIVE--
原生扫码支付、
APP--app
支付,统一下单接口
trade_type
的传参可参考这里
MICROPAY--
刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口
4
、货币类型
货币类型的取值列表:
CNY
:人民币
5
、时间
标准北京时间,时区为东八区;如果商户的系统时间为非标准北京时间。参数值必须根据商户系统所在时区先换算成标准北京时间,
例如商户所在地为
0
时区的伦敦,当地时间为
2014
年
11
月
11
日
0
时
0
分
0
秒,换算成北京时间为
2014
年
11
月
11
日
8
时
0
分
0
秒。
6
、时间戳
标准北京时间,时区为东八区,自
1970
年
1
月
1
日
0
点
0
分
0
秒以来的秒数。注意:部分系统取到的值为毫秒级,需要转换成秒
(10
位数字
)
。
7
、商户订单号
商户支付的订单号由商户自定义生成,微信支付要求商户订单号保持唯一性(建议根据当前系统时间加随机序列来生成订单号)。重新发起一笔支付要使用原订单号,避免重复支付;已支付过或已调用关单、撤销(请见后文的
API
列表)的订单号不能重新发起支付。
8
、银行类型
1、
签名算法
2、
生成随机数算法
3、
商户证书
4、
商户回调
API
安全
2.3
APP支付页面规范示例
◆列表首位
+
默认勾选
+
标准
logo+
推荐标签
+
标语
![](https://i-blog.csdnimg.cn/blog_migrate/8eb9278c7905d77e0a41bc67439aa359.png)
◆素材下载
2.4
Android微信支付
demo
下载
下载后的demo是
eclipse
版的,请求极其不规范,所有请求都放到了主线程中,所以大家可以下载另一个
demo
3.
集成
3.1
依赖
在app下的
build.gradle
里到如依赖
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
compile 'cz.msebera.android:httpclient:4.4.1.2'
}
3.2
导入需要的工具类
![](https://i-blog.csdnimg.cn/blog_migrate/2999187e27c359695744aa888dbb9e28.png)
这些类的作用
1.
wxapi中的
WXPayEntryActivity
是支付时会调用的类,这里
类名和包名均不能改变
2.
Constants存放商户
ID,AppID,Api_key
3.
MainActivity执行的是提交订单(
demo
中做了服务器的工作)
4.
MD5 ,
MD5Util
签名工具,微信支付请求中
sign
是通过
MD5
签名的 看算法
5.
Util是请求类,主要是用
httpClient
请求的
3.3 AndroidManifest
.xml配置
1.
权限
<uses-permission
android
:name=
"android.permission.INTERNET"
/>
<uses-permission
android
:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission
android
:name=
"android.permission.ACCESS_WIFI_STATE"
/>
<uses-permission
android
:name=
"android.permission.READ_PHONE_STATE"
/>
<uses-permission
android
:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
2.
注册类和receiver
<activity
android
:name=
"com.ssmk.wxapi.WXEntryActivity"
android
:exported=
"true"
android
:label=
"@string/app_name"
android
:launchMode=
"singleTop"
>
<intent-filter>
<action
android
:name=
"android.intent.action.MAIN"
/>
<category
android
:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
<intent-filter>
<action
android
:name=
"android.intent.action.VIEW"
/>
<category
android
:name=
"android.intent.category.DEFAULT"
/>
//添加自己的
AppId
<data
android
:scheme=
"#################"
/>
</intent-filter>
</activity>
<activity
android
:name=
"com.ssmk.wxapi.WXPayEntryActivity"
android
:exported=
"true"
android
:launchMode=
"singleTop"
/>
//也没必要
<receiver
android
:name=
"com.ssmk.wxpay.AppRegister"
>
<intent-filter>
<action
android
:name=
"com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP"
/>
</intent-filter>
</receiver>
//支付类
<activity
android
:name=
"com.ssmk.wxpay.Pay2Activity"
>
</activity>
3.4
类的作用
IWXAPI api类 创建方式
IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
注册app msgApi.registerApp(
“
AppID
”
);
PayReq 请求支付类 创建
PayReq req=new PayReq();
拼接参数
req.appId = Constants.APP_ID;
req.partnerId = Constants.MCH_ID;
req.prepayId = resultunifiedorder.get("prepay_id");
req.packageValue = "Sign=WXPay";
req.nonceStr = getNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
List<NameValuePair> signParams = new LinkedList<NameValuePair>()
;
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genAppSign(signParams);
请求支付 msgApi.sendReq(req);
BaseResp 请求支付后,回调到支付完成类(完成并不代表支付成功)(在
wxapi
包下
WXPayEntryActivity
的
@Override
public void onResp(BaseResp resp) {
resp.errCode//
返回结果
名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册
APPID
、项目设置
APPID
不正确、注册的
APPID
与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回
APP
。
resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX
返回类型
)
三、
参考网址
debug
模式
debug
模式使用一个默认的
debug.keystore
进行签名。
这个默认签名
(keystore)
是不需要密码的,它的默认位置在
C:\Users\<
用户名
>\.
Android
\debug.keystore
,如果不存在
Android studio
会自动创建它。
例如我的
debug.keystore
就在
C:\Users\Administrator\.android\debug.keystore
。
release
模式
在我们正式发布项目的时候是不能使用
debug.keystore
的。开发过程中我们也可以使用发布模式运行。可以通过如下设置:
BuildVariants-Build Variant-debug/release
![](https://i-blog.csdnimg.cn/blog_migrate/dad0f621c3a95eafdc177441eb4fba14.png)
如果项目需要细分开发
dev
和生产
pro
版本,每个版本中都包含
debug
和
release
模式,可以这么设置:
![](https://i-blog.csdnimg.cn/blog_migrate/fe54732078571133549baa068ef1eae1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e9a6d50dc57c59be2ee1e54cff5b6eca.png)
就细分成四种模式:
![](https://i-blog.csdnimg.cn/blog_migrate/6cdaa1dca122bc11c9cd97c86f946889.png)
release
模式
需要配置签名才能运行,这时
就需要一个
keystore
如果没有就需要创建,已经创建过
keystore
请跳过此步骤
1.
创建
keystore
,并生成我们的
apk(
打包
)
第一步:
Build --->> Generate Signed APK
![](https://i-blog.csdnimg.cn/blog_migrate/3fb7da78d56e0ec380dd1af9ff05e791.png)
第二步:
Create New···
(
已经创建过
keystore
选
Choose existing···
)
![](https://i-blog.csdnimg.cn/blog_migrate/591ffef50a07a093d99a059b7976d915.png)
第三步:填写相关信息
设置
keystore
路径、密码,设置
key
:别名、密码、有效期,证书等
Key store path:
存放路径
Key
Alias:
别名
Validity(years):
有效期(一般默认
25
年)
Certificate:
证书
First and Last Name
:姓名
Organization Unit
:组织单位
Organization
:组织
City or Locality
:城市或地区
State or Province
:州或省
Country Code(XX)
:国家代码
(XX)
,中国:
86
![](https://i-blog.csdnimg.cn/blog_migrate/fbd4ab6b13bc65339f390cdd37906b21.png)
第四步:输入
key
、
keystore
密码
![](https://i-blog.csdnimg.cn/blog_migrate/993cfd9fde426dd52322db97740b2ea1.png)
第五步:选择发布
app
的路径,默认即可 选择
release
方式发布
![](https://i-blog.csdnimg.cn/blog_migrate/72fa00cfd48292f9dd363550f1bc5986.png)
OK
,发布成功,可以到 刚才设置的目标文件夹下面找到发布的
apk
那对一些人来说,这样也太麻烦了,每次都得输入相关信息,还得进行选择,那么有更简单快捷的方法吗?答案是有的。
我们可以在项目的
app
目录下的
build.gradle
中进行签名的配置。
2.release
模式配置
keystore
Project structure-signing,
输入已创建的
keystore
信息
![](https://i-blog.csdnimg.cn/blog_migrate/3346ba9366d6912dd183798f6802f1a6.png)
使得签名生效需配置
Build Types
![](https://i-blog.csdnimg.cn/blog_migrate/654a9d93fed49377579d5c730450a14c.png)
点击
OK
即可,然后查看对应
build.gradle
的配置文件应该是这样的。当然了,你也可以通过直接在
build.gradle
里面写下面这段。
![](https://i-blog.csdnimg.cn/blog_migrate/dd17137ba8a9e543adc31ecc011b9c69.png)
1
signingConfigs {
2
release {
3
keyAlias
'androiddebugkey'
4
keyPassword
'android'
5
storeFile file(
'C:/Users/ssc/.android/debug.keystore'
)
6
storePassword
'android'
7
}
8
}
9
10
·········
11
12
buildTypes {
13
release {
//
是否混淆
14
minifyEnabled
false
//
是否移除无用资源
15
zipAlignEnabled true
//
混淆的配置文件
16
proguardFiles getDefaultProguardFile(
'proguard-android.txt'
),
'proguard-rules.pro'
17
signingConfig signingConfigs.release
18
}
19
}
![](https://i-blog.csdnimg.cn/blog_migrate/9d4af0e258b3f5cd6259fb03c414ef28.png)
上述的配置虽然配置简单,但是存在不安全性,假如你的项目是开源的,你把签名文件的配置密码之类的信息用明文写在
build.gradle
里面,那是不是很不安全呢
?
可以将签名文件的配置密码之类的信息直接写在
local.properties
下,因为在
Git版本控制
的项目中,我们可以看到我们项目
project
模式根目录下有一个
.gitignore
的文件,里面的配置大概如下所示
![](https://i-blog.csdnimg.cn/blog_migrate/4f593ea79ae4cf4b27ac001c7b62a410.png)
![](https://i-blog.csdnimg.cn/blog_migrate/28fe3ba763c047643ada35de5afd25cb.png)
我们可以看到
/local.properties
,意思就是说
local.properties
默认是不添加到版本控制里面的,因为
local.properties
存储的是我们环境资源的一些相关信息,如
sdk
的路径。故我们可以在
local.properties
下配置签名信息而不用担心密钥外泄。对于开源项目来说,是非常好的。
在
local.properties
下直接添加相关信息
![](https://i-blog.csdnimg.cn/blog_migrate/44d5f0f14a2b25ffab5a0ee1827d1d07.png)
在
build.gradle
里,为了不用明文显示,我们首先要获得
key
的相关配置,所以我们可以在
app
的
build.gradle
里
android {}之上新增代码
![](https://i-blog.csdnimg.cn/blog_migrate/0ded7d0fb86d473fea995252dfbd464e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3e0e1750296bbde5b41994e434d6a5dd.png)
View Code
app/build.gradle
下的
signingConfigs
可以改为:
设置后
Signing
中
keystore
值无需关心
![](https://i-blog.csdnimg.cn/blog_migrate/167d8d52e6f133658bc753ecfb157050.png)
相应的,
buildTypes
也可以配置成这样
![](https://i-blog.csdnimg.cn/blog_migrate/486698e3ae250b362663760c7937f155.png)
1
buildTypes {
2
release {
3
minifyEnabled
false
4
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
5
// signingConfig signingConfigs.release
6
//
签名文件存在,则签名
7
if
(keyfile.exists()) {
8
println("WITH -> buildTypes -> release: using jks key")
9
signingConfig signingConfigs.release
10
}
else
{
11
println("WITH -> buildTypes -> release: using default key")
12
}
13
applicationVariants.all { variant ->
14
variant.outputs.each { output ->
15
def outputFile = output.outputFile
16
if
(outputFile !=
null
&& outputFile.name.endsWith('.apk')) {
17
//
输出
apk
名称为
ruijie_v1.0_wandoujia.apk
18
def fileName = "ruijie_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
19
output.outputFile =
new
File(outputFile.parent, fileName)
20
}
21
}
22
}
23
}
24
}
![](https://i-blog.csdnimg.cn/blog_migrate/1c8d7804e28cb96e19b0a6b508e2c383.png)
到此,前面配置完成。