此篇仅限于android客户端集成微信支付
微信支付和支付宝相比的话里面的坑还是很多的,但是导包导的倒是很简单,就在在build.gradle文件中,添加一条依赖就行:
dependencies {
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
或
dependencies {
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
然后是配置AndroidManifest.xml里面的权限等;
<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"/>
还有记得添加
<!-- 微信支付 -->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop">
</activity>
到这里所有的配置就完成了,然后就是写回调部分:
在项目中新建wxapi文件夹,里面添加WXPayEntryActivity.java文件,这个可以在demo里面找
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.example.administrator.yunleasepiano.R;
import com.example.administrator.yunleasepiano.application.Api;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, Api.APP_ID);
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) {
}
@SuppressLint("LongLogTag")
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "返回的code, errCode = " + resp.errCode);
}
}
里面APP_ID就是你申请的AppID,Log中的code就是返回的结果码,返回0成功,-1失败,-2用户取消支付
回调中errCode值列表:
名称 | 描述 | 解决方案 |
---|---|---|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
接下来就是调起支付的代码,在这之前后台会给你返回一些参数:
字段名 | 变量名 | 类型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
应用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 | 签名,详见签名生成算法 |
{
"code": 800,
"msg": "成功",
"obj": {
"code": "",
"data": {
"appid": "wx51d5433c248dfeb9",
"noncestr": "sGWaLxgAUWIamFHJ",
"partnerid": "1420573002",
"paysign": "578EA6BCAB4E4994359B13635FDE0110",
"prepayId": "wx28180836957578f7f69bfc412778574479",
"sign": "F346A21425D49EA4CF666848AB196EDF",
"signtype": "MD5",
"timeStamp": "1543399722"
},
"desc": "微信支付加载成功",
"stateCode": "SUCCESS"
}
}
咱们要调起支付要的就是这些参数
Gson gson = new Gson();
WacherBean weixinBean = gson.fromJson(response, WacherBean.class);
if (weixinBean.getCode() == 800) {
String appid = weixinBean.getObj().getData().getAppid();
String partnerid = weixinBean.getObj().getData().getPartnerid();
String prepayId = weixinBean.getObj().getData().getPrepayId();
String noncestr = weixinBean.getObj().getData().getNoncestr();
String timestamp = weixinBean.getObj().getData().getTimeStamp();
String sign = weixinBean.getObj().getData().getSign();
Log.e("传递的六个参数=", appid + "\n" + partnerid + "\n" + prepayId + "\n" + noncestr + "\n" + timestamp + "\n" + sign);
IWXAPI msgApi = WXAPIFactory.createWXAPI(ConfirmOrderActivity.this, null);
// 将该app注册到微信
msgApi.registerApp(appid);
PayReq request = new PayReq();
request.appId = appid;
request.partnerId = partnerid;
request.prepayId = prepayId;
request.packageValue = "Sign=WXPay";
request.nonceStr = noncestr;
request.timeStamp = timestamp;
request.sign = sign;
msgApi.sendReq(request);
}
如果公司后台给到了packageValue字段的话就用上,"Sign=WXPay"只是暂用值
如果返回的一直是-1,那就请后台的同事检查一下返回的数据是不是正确了