前言:我再这里只总结Android开发人员需要做的,其他的就去看开发文档吧。
第一步:创建签名,领导会向你要项目包名和一串字符,字符也就是签名。
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如Demo中的package=“net.sourceforge.simcpux”。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如下图所示,绿色串即应用签名。
注意:这个生成的签名是关联你手机上APP的,若APP是线上的话,签名也就是线上的,反之一样。
第二步:在build.gradle文件中,添加如下依赖即可:
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
或
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
(其中,前者包含统计功能)
第三步:混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
第四步:添加必要的权限支持。
<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"/>
第五步:接收微信的请求及返回值,分三小步。
a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge.simcpux,则新添加的类如下图所示)
并在manifest文件里面加上exported属性,设置为true,例如:
b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:
当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
模板如下:
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, ConstantValue.WEChAT_APP_ID);//第二个参数为APPID
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
String result = "";
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
//支付成功后的逻辑
result = "微信支付成功";
break;
case BaseResp.ErrCode.ERR_COMM:
finish();
result = "微信支付失败:" + resp.errCode + "," + resp.errStr;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
finish();
result = "微信支付取消:" + resp.errCode + "," + resp.errStr;
break;
default:
finish();
result = "微信支付未知异常:" + resp.errCode + "," + resp.errStr;
break;
}
}
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}
}
第六步:注册到微信和从后台获取七个必要参数数据。
//从后台获取七个参数数据
JSONObject data = object.optJSONObject("data");
String appid = data.optString("appid");
String partnerid = data.optString("partnerid");
String prepayid = data.optString("prepayid");
String noncestr = data.optString("noncestr");
String timestamp = data.optString("timestamp");
String aPackage = data.optString("package");
String sign = data.optString("sign");
String out_trade_no = data.optString("out_trade_no");//这个可有可无
//可在onCreate()或者合适的地方注册微信
api = WXAPIFactory.createWXAPI(PaymentActivity.this, appid, true);
api.registerApp(appid);//APPID
//把请求回来的七个参数放在Bean里面
WXPaymentBean wxPayBean = new WXPaymentBean(appid, partnerid, prepayid, noncestr, timestamp, aPackage, sign, out_trade_no);
goWayPaymentWechat(wxPayBean);
七个参数说明如下:
字段名 | 变量名 | 类型 | 必填 | 示例值 | 描述 |
应用ID | appid | String(32) | 是 | wx8888888888888888 | 微信开放平台审核通过的应用APPID |
商户号 | partnerid | String(32) | 是 | 1900000109 | 微信支付分配的商户号 |
预支付交易会话ID | prepayid | String(32) | 是 | WX1217752501201407033233368018 | 微信返回的支付交易会话ID |
扩展字段 | package | String(128) | 是 | Sign=WXPay | 暂填写固定值Sign=WXPay |
随机字符串 | noncestr | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位。推荐随机数生成算法 |
时间戳 | timestamp | String(10) | 是 | 1412000000 | 时间戳,请见接口规则-参数规定 |
签名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 签名,详见签名生成算法注意:签名方式一定要与统一下单接口使用的一致 |
把Bean类中的属性写在这里,方便日后使用:
public class WXPaymentBean {
private String appid;
private String partnerid;
private String prepayid;
private String noncestr;
private String timestamp;
private String aPackage;
private String sign;
private String out_trade_no;
}
第七步:发起请求,调用支付Api。
private void goWayPaymentWechat(WXPaymentBean wxPayBean) {
PayReq req = new PayReq();
//wxPayBean是根据服务器返回json数据生成bean实体对象
req.appId = wxPayBean.getAppid();
req.partnerId = wxPayBean.getPartnerid();
req.prepayId = wxPayBean.getPrepayid();
req.nonceStr = wxPayBean.getNoncestr();
req.timeStamp = wxPayBean.getTimestamp();
req.packageValue = wxPayBean.getaPackage();
req.sign = wxPayBean.getSign();
req.extData = "geology";
//发起支付请求
api.sendReq(req);
finish();
}
返回结果
名称 | 描述 | 解决方案 |
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |