Android中微信支付

前言:我再这里只总结Android开发人员需要做的,其他的就去看开发文档吧。

第一步:创建签名,领导会向你要项目包名和一串字符,字符也就是签名。

应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如Demo中的package=“net.sourceforge.simcpux”。

应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如下图所示,绿色串即应用签名。签名工具下载地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk

修改开发信息

注意:这个生成的签名是关联你手机上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);

七个参数说明如下:

字段名变量名类型必填示例值描述
应用IDappidString(32)wx8888888888888888微信开放平台审核通过的应用APPID
商户号partneridString(32)1900000109微信支付分配的商户号
预支付交易会话IDprepayidString(32)WX1217752501201407033233368018微信返回的支付交易会话ID
扩展字段packageString(128)Sign=WXPay暂填写固定值Sign=WXPay
随机字符串noncestrString(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,不长于32位。推荐随机数生成算法
时间戳timestampString(10)1412000000时间戳,请见接口规则-参数规定
签名signString(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。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值