1.微信支付
1.1微信开放平台开通支付功能,填写应用包名签名,获取appkey,appserver
1.2添加微信sdk
//腾讯sdk
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:5.4.0'
1.3添加微信支付回调在项目包名下创建wxapi包名,创建回调类
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.app.yanchuwang.R;
import com.app.yanchuwang.bean.EventMessageBean;
import com.app.yanchuwang.urls.Urls;
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;
import org.greenrobot.eventbus.EventBus;
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private static final String TAG = "fate";
private IWXAPI mWxApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxpay_entry);
mWxApi = WXAPIFactory.createWXAPI(this, "微信appKey");
mWxApi.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
mWxApi.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
}
/**
* 得到支付结果回调
*/
@Override
public void onResp(BaseResp baseResp) {
Log.d(TAG, "onPayFinish, errCode = " + baseResp.errCode);// 支付结果码
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
Log.i(TAG, "支付成功");
// 还需要向商户后台请求支付结果,最终结果以后台返回结果为准
EventMessageBean bean = new EventMessageBean(Urls.CODE_PAY_SECCESS,"success");
EventBus.getDefault().post(bean);
finish();
break;
case BaseResp.ErrCode.ERR_COMM:
// 发生错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、
// 注册的APPID与设置的不匹配、其他异常等。
Log.i(TAG, "发生错误");
Toast.makeText(WXPayEntryActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
finish();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
// -2 用户取消 发生场景:用户不支付了,点击取消,返回APP。
Log.i(TAG, "用户取消");
EventMessageBean bean1 = new EventMessageBean(Urls.CODE_PAY_ERROR,"error");
EventBus.getDefault().post(bean1);
finish();
break;
default:
Log.i(TAG, "支付失败-其他的锅" + baseResp.errCode);
break;
}
}
}
Manifest.xml中添加
<!--微信支付权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<activity android:name="com.app.yanchuwang.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Dialog"></activity>
1.4 微信支付请求后台,后台返回支付参数paybean就是后台返回的支付参数,拼接之后调用支付就行了
private IWXAPI mWxApi;
mWxApi = WXAPIFactory.createWXAPI(this, null);
mWxApi.registerApp("微信appid");
Gson gson = new Gson();
PayBean payBean = gson.fromJson(json, PayBean.class);
String appid = payBean.getAppid();//appID
String nonce_str = payBean.getNonce_str();//随机字符串
String packageValue = "Sign=WXPay";//Sign=WXPay";扩展字段,这里固定填写Sign=WXPay
String partnerid = payBean.getMch_id();//商户Id
String prepayid = payBean.getPrepay_id() + "";//预支付交易会话ID
String sign = payBean.getSign2();//签名
String timestamp = payBean.getTime() + "";//时间戳
if (!TextUtils.isEmpty(appid) && !TextUtils.isEmpty(nonce_str) && !TextUtils.isEmpty(packageValue) && !TextUtils.isEmpty(partnerid)
&& !TextUtils.isEmpty(prepayid) && !TextUtils.isEmpty(sign) && !TextUtils.isEmpty(timestamp)) {
PayReq request = new PayReq();
request.appId = appid;
request.partnerId = partnerid;
request.prepayId = prepayid;
request.packageValue = packageValue;
request.nonceStr = nonce_str;
request.timeStamp = timestamp;
request.sign = sign;
mWxApi.sendReq(request);
}
支付失败一般返回-1,1.查看后台返回参数时候有问题参数不能为空,2.查看签名包名appid是否填写正确
二.支付宝支付
2.1支付宝支付较为简单libs中导入alipaySdk-xxxxxx.jar包,右键add as library初始化添加jar包
2.2调用支付宝支付后台会回调支付参数,一个特别长的字符串json
if (!TextUtils.isEmpty(json)) {
PayTask alipay = new PayTask(MainActivity.this);
Map<String, String> result = alipay.payV2(json, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
2.3支付回调处理
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResultBean payResult = new PayResultBean((Map<String, String>) msg.obj);
/**
* 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
webView.loadUrl("javascript:paySuccess()");
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
webView.loadUrl("javascript:payError()");
}
break;
}
}
}
};
2.4bean
package com.rhkj.kemizhibo.bean;
import android.text.TextUtils;
import java.util.Map;
/**
* Created by dell on 2019/10/14.
*/
public class PayResultBean {
private String resultStatus;
private String result;
private String memo;
public PayResultBean(Map<String, String> rawResult) {
if (rawResult == null) {
return;
}
for (String key : rawResult.keySet()) {
if (TextUtils.equals(key, "resultStatus")) {
resultStatus = rawResult.get(key);
} else if (TextUtils.equals(key, "result")) {
result = rawResult.get(key);
} else if (TextUtils.equals(key, "memo")) {
memo = rawResult.get(key);
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}
2.3mainfest配置
<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="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />