Android--微信支付


目录
一、  创建应用
进入管理中心,
2>  管理中心  /  创建移动应用
图片按要求上传,否则,上传不上去,上传的图片最好清晰
 
创建应用时 应用官网 要正确
 
 
之后就等提交审核了,一般在三到四天之内有消息
应用签名的生成方法:
(1)  下载应用签名工具: 签名工具下载地址 https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk      下载下来
 
不要解压,更改文件后缀名为.apk  然后安装到手机就行了
(2)  签名工具作用: 根据项目的应用包名和编译使用的 keystore ,可由签名工具生成一个 32 位的 md5 串,在调试的手机上安装签名工具后,运行可生成应用签名串,绿色串即应用签名。
(3)  不要着急着生成签名:  先打包生成release.apk 将 release.apk 安装到手机 然后再用签名工具生成 签名
(4)  怎么生成release版本:  参考地址 http://www.cnblogs.com/details-666/p/keystore.html
(5) 
(6)  这里没设置好的话,后面支付会出现问题,具体问题后面再说
 
3>  管理中心\应用详情
 
申请开通
不过这已经是审核通过后的事情了,
所以当确定应用有这个功能的时候,应用网址也存在,那么就需要及时申请,不然等到做到这个模块再申请,那调试也就必须等着了
4>  应用审核过后,申请开通支付功能(这里面会支付给微信300大洋),开通后会给商户账户 支付的时候用到的信息就有 商户号 微信分配的公众账号 ID      API 密钥,在商户平台设置
 
商户在微信公众平台 ( 申请扫码支付、公众号支付 ) 或开放平台 ( 申请 APP 支付 ) 按照相应提示,申请相应微信支付模式。微信支付工作人员审核资料无误后开通相应的微信支付权限。微信支付申请审核通过后,商户在申请资料填写的邮箱中收取到由微信支付小助手发送的邮件,此邮件包含开发时需要使用的支付账户信息
邮件中参数 API参数名 详细说明
APPID appid appid是微信公众账号或开放平台APP的唯一标识,在公众平台申请公众账号或者在开放平台申请APP账号后,微信会自动分配对应的appid,用于标识该应用。可在微信公众平台-->开发者中心查看,商户的微信支付审核通过邮件中也会包含该字段值。
微信支付商户号 mch_id 商户申请微信支付后,由微信支付分配的商户收款账号。
API密钥 key 交易过程生成签名的密钥,仅保留在商户系统和微信支付后台,不会在网络中传播。商户妥善保管该Key,切勿在网络中传输,不能在其他客户端中存储,保证key不会被泄漏。商户可根据邮件提示登录微信商户平台进行设置。也可按一下路径设置:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
Appsecret secret AppSecret是APPID对应的接口密码,用于获取接口调用凭证access_token时使用。
 
二、  支付集成
1.  支付(业务)流程图解
以下是交互时序图,统一下单 API 、支付结果通知 API 和查询订单 API 等都涉及签名过程,调用都必须在商户服务器端完成。如图所示。
 
8.6 APP 支付时序图
商户系统和微信支付系统主要交互说明:
步骤 1 :用户在商户 APP 中选择商品,提交订单,选择微信支付。
步骤 2 :商户后台收到用户支付单,调用微信支付统一下单接口。参见【 统一下单API 】。
步骤 3 :统一下单接口返回正常的 prepay_id ,再按签名规范重新生成签名后,将数据传输给 APP 。参与签名的字段名为 appid partnerid prepayid noncestr timestamp package 。注意: package 的值格式为 Sign=WXPay ios必须是这个
步骤 4 :商户 APP 调起微信支付。 api 参见本章节【 app端开发步骤说明
步骤 5 :商户后台接收支付通知。 api 参见【 支付结果通知API
步骤 6 :商户后台查询支付结果。, api 参见【 查询订单API
 
 
2.1  支付中术语
支付模式(这里我们要用到app支付)
1 刷卡支付
刷卡支付是用户展示微信钱包内的 刷卡条码 / 二维码 给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
2 扫码支付
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信 扫一扫 完成支付的模式。该模式适用于 PC 网站支付、实体店单品或订单支付、媒体广告支付等场景。
公众号支付是用户在微信中打开商户的 H5 页面,商户在 H5 页面通过调用微信支付提供的 JSAPI 接口调起微信支付模块完成支付。应用场景有:
  用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
  用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
  将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
4 APP支付
APP 支付又称移动端支付,是商户通过在移动端应用 APP 中集成开放 SDK 调起微信支付模块完成支付的模式。
名词解释
1 、微信公众平台
微信公众平台是微信公众账号申请入口和管理后台。商户可以在公众平台提交基本资料、业务资料、财务资料申请开通微信支付功能。
平台入口: http://mp.weixin.qq.com
2 、微信开放平台
微信开放平台是商户 APP 接入微信支付开放接口的申请入口,通过此平台可申请微信 APP 支付。
平台入口: http://open.weixin.qq.com
3 、微信商户平台
微信商户平台是微信支付相关的商户功能集合,包括参数配置、支付数据查询与统计、在线退款、代金券或立减优惠运营等功能。
平台入口: http://pay.weixin.qq.com
4 、微信支付系统
微信支付系统是指完成微信支付流程中涉及的 API 接口、后台业务处理系统、账务系统、回调通知等系统的总称。
5 、商户收银系统
商户收银系统即商户的 POS 收银系统,是录入商品信息、生成订单、客户支付、打印小票等功能的系统。接入微信支付功能主要涉及到 POS 软件系统的开发和测试,所以在下文中提到的商户收银系统特指 POS 收银软件系统。
6 、商户后台系统
商户后台系统是商户后台处理业务系统的总称,例如:商户网站、收银系统、进销存系统、发货系统、客服系统等。
7 、商户证书
商户证书是微信提供的二进制文件,商户系统发起与微信支付后台服务器通信请求的时候,作为微信支付后台识别商户真实身份的凭据。
8 、签名
商户后台和微信支付后台根据相同的密钥和算法生成一个结果,用于校验双方身份合法性。签名的算法由微信支付制定并公开,常用的签名方式有: MD5 SHA1 SHA256 HMAC 等。(一般用MD5)  
9 、支付密码
支付密码是用户开通微信支付时单独设置的密码,用于确认支付完成交易授权。该密码与微信登录密码不同。
10 Openid
用户的身份标识,不同应用拥有不同的 openid 。商户后台系统通过登录授权、支付通知、查询订单等 API 可获取到用户的 openid 。主要用途是判断同一个用户,如果商户有公众号,可以通过获取 unionid 判断同一个用户。
 
2.2  接口规则
协议规则
商户接入微信支付,调用 API 必须遵循以下规则:
传输方式 为保证交易安全性,采用HTTPS传输
提交方式 采用POST方法提交
数据格式 提交和返回数据都为XML格式,根节点名为xml
字符编码 统一采用UTF-8字符编码
签名算法 MD5,后续会兼容SHA1、SHA256、HMAC等。
签名要求 请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法
证书要求 调用申请退款、撤销订单接口需要商户证书
判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态
 
参数规则
1 body 字段格式
使用场景 支付模式 商品字段规则 样例 备注
第三方APP APP支付 应用市场上的APP名字-商品概述 天天爱消除-游戏充值 
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+ 推荐标签 + 标语
 
◆素材下载
 
 
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  导入需要的工具类
 
这些类的作用
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  返回类型
 
 
三、  参考网址
 
 
 
 
 
 
 
我们使用 Android  Studio 运行我们的 app ,无非两种模式: debug release 模式。
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
 
如果项目需要细分开发 dev 和生产 pro 版本,每个版本中都包含 debug release 模式,可以这么设置:
 
 
就细分成四种模式:
 
release 模式 需要配置签名才能运行,这时 就需要一个 keystore
如果没有就需要创建,已经创建过 keystore 请跳过此步骤
 
1. 创建 keystore ,并生成我们的 apk( 打包 )
  第一步: Build --->> Generate Signed APK
 
第二步: Create New··· 已经创建过 keystore Choose existing···
 
第三步:填写相关信息
设置 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
 
 
第四步:输入 key keystore 密码
 
第五步:选择发布 app 的路径,默认即可 选择 release 方式发布
 
OK ,发布成功,可以到 刚才设置的目标文件夹下面找到发布的 apk
 
那对一些人来说,这样也太麻烦了,每次都得输入相关信息,还得进行选择,那么有更简单快捷的方法吗?答案是有的。
我们可以在项目的 app 目录下的 build.gradle 中进行签名的配置。  
2.release 模式配置 keystore
Project structure-signing, 输入已创建的 keystore 信息
 
使得签名生效需配置 Build Types
 
点击 OK 即可,然后查看对应 build.gradle 的配置文件应该是这样的。当然了,你也可以通过直接在 build.gradle 里面写下面这段。
 
 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  }
 
 
上述的配置虽然配置简单,但是存在不安全性,假如你的项目是开源的,你把签名文件的配置密码之类的信息用明文写在 build.gradle 里面,那是不是很不安全呢 ?
可以将签名文件的配置密码之类的信息直接写在 local.properties 下,因为在 Git版本控制 的项目中,我们可以看到我们项目 project 模式根目录下有一个 .gitignore 的文件,里面的配置大概如下所示
 
我们可以看到 /local.properties ,意思就是说 local.properties 默认是不添加到版本控制里面的,因为 local.properties 存储的是我们环境资源的一些相关信息,如 sdk 的路径。故我们可以在 local.properties 下配置签名信息而不用担心密钥外泄。对于开源项目来说,是非常好的。
local.properties 下直接添加相关信息
 
build.gradle 里,为了不用明文显示,我们首先要获得 key 的相关配置,所以我们可以在 app build.gradle
android {}之上新增代码
 
View Code
app/build.gradle 下的 signingConfigs 可以改为:
?
1
2
3
4
5
6
7
8
signingConfigs {
release {
keyAlias keystoreAlias
keyPassword keystoreAliasPSW
storeFile keyfile
storePassword keystorePSW
}
}
  
设置后 Signing keystore 值无需关心
 
相应的, buildTypes 也可以配置成这样
 
 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      }
 
到此,前面配置完成。

: 查询 keystore 的相关信息,如查看 sha1 的值;可以在运行窗口,定位到 keystore 所在的路径,执行 cd C:\Users\ssc\.android
执行这条语句后就能显示 Key 的所有信息 ( android 默认 keystore 为例 )
keytool -list -v -keystore xxx.jks
 
 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值