官方集成文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5#
一、在您 App Module 的 build.gradle 中,添加下面的内容,将微信 SDK 作为项目依赖:
dependencies {
//添加下面的内容
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
//...其他依赖项
}
二、在项目中创建wxapi文件夹,在其下创建WXPayEntryActivity类。
三、在清单文件AndroidManifest.xml的application标签中配置如下代码:
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="你的appid"/>
</intent-filter>
</activity>
至此。配置就结束了,接下来上具体代码演示:
首先,订单的加密下单都应在后台操作,所以先调用自己后台的接口,传递相应参数给后台,可以使其携带参数调取微信的接口,达到成功下单,成功下单后,微信会返回一个xml数据串,但这个数据串不能直接让移动端调取微信sdk支付,需要再签名一下,可以让后台直接完成。但我这是自己移动端进行了签名,用到的工具类,以下也已提供WXPaySignUtil类,MD5Util类。
WXPayEntryActivity类
public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
@BindView(R.id.wechat_paysucced_tv)
TextView wechatPaysuccedTv;
@BindView(R.id.wechat_sure_btn)
TextView wechatSureBtn;
private IWXAPI api;
@Override
protected int getLayoutID() {
return R.layout.pay_result;
}
@Override
public void initView() {
api = MyApplication.getWXapi();
try {
if (!api.handleIntent(getIntent(), this)) {
finish();
}
} catch (Exception e) {
e.printStackTrace();
}
TextView wechatSureBtn = findViewById(R.id.wechat_sure_btn);
wechatSureBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(WXPayEntryActivity.this, ModelTwoRegistrationActivity.class));
finish();
}
});
}
@Override
public void initPresenter() {
}
@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) {
int code = resp.errCode;
switch (code) {
case 0://支付成功
wechatPaysuccedTv.setText("支付成功");
wechatSureBtn.setText("完成");
break;
case -1://支付失败("签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、您的微信账号异常等。")
wechatPaysuccedTv.setText("支付失败:-1");
wechatSureBtn.setText("返回");
break;
case -2://用户取消支付后的界面
wechatPaysuccedTv.setText("支付失败,用户取消支付");
showToast("用户取消支付");
wechatSureBtn.setText("返回");
break;
}
Log.e(TAG, "onPayFinish, errCode = " + resp.errCode + ", errStr = " + resp.errStr + ", openId = " + resp.openId + ",transaction = " + resp.transaction);
// if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
// AlertDialog.Builder builder = new AlertDialog.Builder(this);
// builder.setTitle("支付结果");
// builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
// builder.show();
// }
}
@OnClick(R.id.wechat_sure_btn)
public void onViewClicked() {
Intent intent = new Intent(WXPayEntryActivity.this, ModelTwoRegistrationActivity.class);
startActivity(intent);
finish();
}
回调中errCode值列表:
名称 | 描述 | 解决方案 |
---|---|---|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
WXPaySignUtil类
public class WXPaySignUtil {
//对后台返回的预支付订单进行加密
public static Map<String, String> payInfo(String appId,String micId, String prepayId, String nonceStr, String timeStamp, String sign){
SortedMap<String, String> signParam = new TreeMap<String, String>();
signParam.put("appid", appId);//app_id
signParam.put("partnerid", micId);//微信商户账号
signParam.put("prepayid", prepayId);//预付订单id
signParam.put("package", "Sign=WXPay");//默认sign=WXPay
signParam.put("noncestr", nonceStr);//自定义不重复的长度不长于32位
signParam.put("timestamp",timeStamp);//北京时间时间戳
String signAgain = createSign("UTF-8", signParam);//再次生成签名
signParam.put("sign", signAgain);
return signParam;
}
//定义签名,微信根据参数字段的ASCII码值进行排序 加密签名,故使用SortMap进行参数排序
public static String createSign(String characterEncoding,SortedMap<String,String> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + "f1a2s3d4g5r6e7g8g9a0gsXXXXwwwwsd");//最后加密时添加商户密钥,由于key值放在最后,所以不用添加到SortMap里面去,单独处理,编码方式采用UTF-8
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
}
MD5Util类
class MD5Util {
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString;
}
private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}
在application类中注册APPID
public class MyApplication extends LitePalApplication {
private static Context mContext;
public static final String APP_ID = "你的appid";
private static IWXAPI api;
public static Context getInstance() {
return mContext;
}
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
MultiDex.install(context);
}
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static IWXAPI getWXapi() {
return api;
}
}
//普通商户版微信支付
public void wechatPay(String partnerId, String prepayId, String nonceStr, String timeStamp, String sign) {
PayReq req = new PayReq();
req.appId = MyApplication.APP_ID;//你的微信appid
req.partnerId = partnerId;//商户号
req.prepayId = prepayId;//预支付交易会话ID
req.nonceStr = nonceStr;//随机字符串
req.timeStamp = timeStamp;//时间戳
req.packageValue = "Sign=WXPay";//扩展字段,这里固定填写Sign=WXPay
req.sign = sign;//签名
req.extData = "app data"; // optional
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
MyApplication.getWXapi().sendReq(req);
}
//服务商版微信支付 public void wechatFwsPay(String appId, String mchId, String prepayId, String nonceStr, String timeStamp, String sign) { //服务商版支付 PayReq req = new PayReq(); req.appId = "wx8864d62b0167ecd8";//子商户appid req.partnerId = "1554575261";//子商户号 req.prepayId = prepayId; req.packageValue = "Sign=WXPay"; req.nonceStr = nonceStr; req.timeStamp = timeStamp; req.sign = sign; // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信 MyApplication.getWXapi().sendReq(req); }