首先检查微信支付开放平台有没有创建项目,里面的签名(MD5签名,不是SHA1,通过工具获取最好)和包名是否一致,支付权限是否开通,debug包需要签名realse的签名,可以直接给debug配置release签名,否则直接运行的debug的签名和realse签名是不一致的,会存在问题,ok了之后看下面流程
支付流程
1 引入包
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
2 调用
下面所有的参数都是服务器传给你的,没有一个是需要你自己获取的,当然如果你需要在客户端做最后的签名也是可以的
重点,怎么测试服务器给你的数据对不对?绝大多数-1错误码都是服务器给的参数不对,微信支付demo中有https://wxpay.wxutil.com/pub_v2/app/app_pay.php (不确定微信会不会跟换地址,建议去demo里面找)这个地址是测试数据,把测试的demo数据直接写死到下面的参数中,如果可以请求成功,你的支付流程就没有问题,当前你首先需要先检查微信开放平台的MD5签名是否对,apikey,包名是否一致
服务器流程是这样的,第一步你传给他订单的信息,比如价格什么的,服务器会对你的信息做签名什么的然后向微信接口请求,微信接口会返回给服务器下面的商品信息以及签名,noncestr等
最重要的第三步,服务器返回给你数据并不是直接把微信的返给他的数据直接返回给你,服务器需要把微信返回的数据再次签名,这次生成的签名才是最终的签名,是客户端需要的签名,最终签名中用到的参数就是服务器需要返给客户端的参数
{
"appid": "wxb4ba3c02aa476ea1",
"partnerid": "1900006771",
"package": "Sign=WXPay",
"noncestr": "6b3be5e19da289f4984639cb9a44f925",
"timestamp": 1565144431,
"prepayid": "wx071020313188630c79dcf66e1848742832",
"sign": "0896E1938417C2F0393E60FCD1F5DB0D"
}
IWXAPI api = WXAPIFactory.createWXAPI(MyMoneyActivity.this, null);
api.registerApp(LoginReadActivity.APP_ID);
PayReq req = new PayReq();
req.appId = appid/*"wxb475175b226bba0f"*/;//你的微信appid
req.partnerId = mch_id/*"1510166111"*/;//商户号
req.prepayId =prepay_id/*"wx0616503763951401e44f8e8e1026290000"*/;//预支付交易会话ID
req.nonceStr = nonce_str/*"U3iEyfr82e79RxUEZQbRpQRKBYaBlnXo"*/;//随机字符串
req.timeStamp =timestamp+"";//1565144431 时间戳
req.packageValue = "Sign=WXPay";//写死,固定的
req.sign = sign/*"0896E1938417C2F0393E60FCD1F5DB0D"*/;//签名
// req.extData = "app data"; // optional 这一行可以不要
api.sendReq(req);
3 编写支付回调,
(重要)这个回调activity名字必须是WXPayEntryActivity ,看清楚是WXPayEntryActivity 不是WXEntryActivity
大多数调用微信支付没有反应是这个问题,也可能是你没有下载微信
这个activity存放的位置必须是xxx(你的包).wxapi.WXEntryActivity不能改变
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);
api = WXAPIFactory.createWXAPI(this, LoginReadActivity.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, "onPayFinish, errCode = " + resp.errCode);
/*
0 支付成功
-1 发生错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 发生场景:用户不支付了,点击取消,返回APP。
*/
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
// 根据返回码
int code = resp.errCode;
switch (code) {
case 0:
// 去本地确认支付结果
EventBus.getDefault().post("0");
finish();
break;
case -1:
Toast.makeText(this, "支付异常", Toast.LENGTH_SHORT).show();
finish();
break;
case -2:
Toast.makeText(this, "支付已取消", Toast.LENGTH_SHORT).show();
finish();
break;
default:
Toast.makeText(this, "支付失败", Toast.LENGTH_SHORT).show();
finish();
break;
}
}
}