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

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

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

应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如下图所示,绿色串即应用签名。

微信小程序支付签名生成 java 微信支付签名怎么生成_微信支付

注意:这个生成的签名是关联你手机上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,则新添加的类如下图所示)

微信小程序支付签名生成 java 微信支付签名怎么生成_微信支付_02

并在manifest文件里面加上exported属性,设置为true,例如:

微信小程序支付签名生成 java 微信支付签名怎么生成_微信支付_03

b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法

c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:

微信小程序支付签名生成 java 微信支付签名怎么生成_微信支付_04

当微信发送请求到你的应用,将通过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。