android 集成微信支付(已模拟统一下单)
微信支付和支付宝支付是我们现在覆盖电商爆炸app的一个必备功能,那么微信支付是怎么实现的呢?我们今天理一下步骤。我是在h5调android原生接口,所以android端就实现了一个微信支付接口,但是思路是一致的。我这里模拟统一下单主要是可以走一个完成的支付流程,实际开发中模拟统一下单是你后台人员负责这个接口,后台需要打通订单系统,你只需要调用后台接口返回预支付id,然后在调用支付接口即可。
首先看一下整体支付效果截图
再来说下流程,流程是传入所需要的10大参数,调用统一下单接口,获取到预支付id,然后在调用支付接口,最后微信回调即整过流程完成。
所以先去阅读以下微信app支付开发文档是很有必要的。链接是https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
在查看以下API列表也是很有必要的,链接是https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
一、微信开放平台
创建应用,获取appid,平台上填写签名需要注意一下,必须一致,如果是release的话那么后期测试的时候就release包测试,不过很不方便,所以在测试期间一般直接用debug版本的包,方便测试。
二、微信商户平台
获取得到商户号并在商户平台配置API密钥(生成预支付订单号需要)
三、代码整体目录展示(android项目)
四、代码
1、build.gradle集成:
// 微信支付包
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
// xml和对象互转
compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.3.1'
2、AndroidManifest.xml 加入注册antivity和权限
(1)activity
<!--微信支付注册-->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
(2)权限
<uses-permission android:name="android.permission.INTERNET" />
3、JavaScriptUtils类: js调用android入口,也是程序入口处
public static PrepayIdInfo bean = null;
/**
* 微信支付
*/
@JavascriptInterface
public void wxPayClient(String shoppingDesc, String orderNo, int totalMoney) {
// 请求统一下单服务 生成预支付Id
OrederSendInfo sendInfo = new OrederSendInfo(Config.APP_ID,Config.MCH_ID,new WXPayUtils().genNonceStr(),shoppingDesc,orderNo,String.valueOf(totalMoney),"127.0.0.1","http://www.weixin.qq.com/wxpay/pay.php","APP");
NetWorkFactory.UnfiedOrder(sendInfo, new NetWorkFactory.Listerner() {
@Override
public void Success(String data) {
// data是xml,从xml里面获取prepay_id
XStream xStream = new XStream();
xStream.alias("xml", PrepayIdInfo.class);
bean = (PrepayIdInfo) xStream.fromXML(data);
System.out.println(bean.toString());
// 调用微信支付
new WXPayUtils().Pay(bean.getPrepay_id());
}
@Override
public void Faiulre(String data) {
}
});
}
4、OrederSendInfo类
package com.iwiteks.PalmarTourism.bean;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* 统一下单信息
* Created by xmg on 2016/12/5.
*/
@XStreamAlias("xml")
public class OrederSendInfo {
// 应用ID appid
// 商户号 mch_id
// 随机字符串 nonce_str 随机数生成算法
// 商品描述 body 鹅豆-旅游
// 商户订单号 out_trade_no 32个字符内
// 总金额 total_fee 单位:分
// 终端IP spbill_create_ip
// 通知地址 notify_url
// 交易类型 trade_type APP
// 签名 sign 签名生成算法
private String appid;
private String mch_id;
private String nonce_str;
private String body;
private String out_trade_no;
private String total_fee;
private String spbill_create_ip;
private String notify_url;
private String trade_type;
private String sign;
public OrederSendInfo(String appid, String mch_id, String nonce_str, String body, String out_trade_no, String total_fee, String spbill_create_ip, String notify_url, String trade_type) {
this.appid = appid;
this.mch_id = mch_id;
this.nonce_str = nonce_str;
this.body = body;
this.out_trade_no = out_trade_no;
this.total_fee = total_fee;
this.spbill_create_ip = spbill_create_ip;
this.notify_url = notify_url;
this.trade_type = trade_type;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getMch_id() {
return mch_id;
}
public void setMch_id(String mch_id) {
this.mch_id = mch_id;
}
public String getNonce_str() {
return nonce_str;
}
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getOut_t