Android微信支付
项目要上支付功能,老大让我写一个支付的demo看看效果。支付宝和微信都要。支付宝还好说,有一整套的测试环境(沙箱),一上午就做出来了。
微信就不得了了,从头到尾你得自己写。老大说了,现在后台比较忙。你先自己下单,自己支付,自己···
微信支付-APP支付的整体流程是:通过下单接口向微信的服务器下单,用微信返回的订单信息调支付接口。本身也不难,但是微信的文档啊。是真TMD烂。全网最烂,没有之一。
1.通过微信的统一下单接口下单
1.1配置常量参数
appId:是微信开放平台!!!里面的AppID(微信开放平台->管理中心->应用详情)
partnerId:是微信商户平台!!!里的微信支付商户号(微信商户平台->账户中心->商户信息)
privateKey:是微信商户平台!!!里的API秘钥。秘钥默认是不显示的,只能重置。(微信商户平台->账户中心->API安全)
val WX_APP_ID = "" //微信分配的APP_ID
val WX_PARTNER_ID = "" //微信分配的 PARTNER_ID (商户ID)
val WX_PRIVATE_KEY = "" //微信分配的 PRIVATE_KEY (私钥)
var ORDER_NUM = ""//订单号
var NONEC_STR = ""//随机字符串
var IP = ""//手机ip
val URL = "www.baidu.com"//回调地址
val ENCRYPT_WAY = "MD5"//加密方式
1.2下单接口的的请求xml
没错,微信的接口请求参数要求XML格式(日了狗)。你让我一个Android写xml请求(手动黑人问号)。
var xmlStr = """<xml>
<appid>$WX_APP_ID</appid>
<body>$ORDER_CONTENT</body>
<mch_id>$WX_PARTNER_ID</mch_id>
<nonce_str>$NONEC_STR</nonce_str>
<notify_url>$URL</notify_url>
<out_trade_no>$ORDER_NUM</out_trade_no>
<spbill_create_ip>$IP</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>APP</trade_type>
<sign_type>$ENCRYPT_WAY</sign_type>
</xml>
"""
1.3Retrofit配置
微信官方demo用的是httpclient+eclipse项目(我敲尼玛啊)
我这里用的是Retrofit(之所以没有Rxjava是xml解析比较麻烦,手动解析比较快)
gradle配置一下
implementation "com.squareup.retrofit2:retrofit:2.3.0"
//日志拦截器
implementation "com.squareup.okhttp3:logging-interceptor:3.5.0"
interface RetrofitService {
companion object {
val BaseURL: String = "https://api.mch.weixin.qq.com"//访问接口的ip和端口
}
@POST("/pay/unifiedorder")
fun getWxOrderInfo(@Body body: RequestBody): Call<ResponseBody> //获取微信支付订单
}
fun getWxOrderInfo(xml: String, callback: Callback<ResponseBody>) {
//拦截器(打印网络请求log)
var logInterceptor: HttpLoggingInterceptor = HttpLoggingInterceptor(HttpLogger())
logInterceptor.level = HttpLoggingInterceptor.Level.BASIC
var okHttpClient: OkHttpClient = OkHttpClient.Builder()
.sslSocketFactory(SSLSocketFactoryUtils.createSSLSocketFactory(), SSLSocketFactoryUtils.createTrustAllManager())//
.connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.addInterceptor(logInterceptor)//添加拦截器
.build()
var retrofit = Retrofit.Builder()
?.baseUrl(RetrofitService.BaseURL)
?.addConverterFactory(SimpleXmlConverterFactory.create())
?.client(okHttpClient)
?.build()
var api = retrofit?.create(RetrofitService::class.java)
var body = RequestBody.create(MediaType.parse("application/xml;charset=UTF-8"), xml)
api?.getWxOrderInfo(body)
?.enqueue(callback)
}
1.4统一下单
在1.3中已经配置好了网络请求。在1.2中xml请求参数也配置好了,那么就可以直接进行下单了。下面主要说下各个必传参数代表什么(官方文档也写得很清楚,以官方文档为准)。
appid:是微信平台给你的APP项目分配的唯一标识
mch_id:商户号
nonce_str:随机字符串
notify_url:接收微信支付异步通知回调地址(我这里是客户端不需要回调,所有随便填的百度)
body:商品描述
out_trade_no:商户订单号