调起支付:orderInfo就是那个超长字符串
fun toAliPay(activity: AppCompatActivity, orderInfo: String, mHandler: Handler, flag: Int) {
val payRunnable = Runnable {
val alipay = PayTask(activity)
val result = alipay.payV2(orderInfo, true)
//发送给handle
val msg = Message()
msg.what = flag
msg.obj = result
mHandler.sendMessage(msg)
}
// 必须异步调用
val payThread = Thread(payRunnable)
payThread.start()
}
这样就OK了,支付完成还有个回调,解析handle发出去的result参数即可,
code = 9000代表支付成功,其他失败
2.如果你的项目是APP嵌套的H5商城需要调起支付宝,那么有2个方案:
方案一:H5拿到那个超长字符串给APP,APP去调起支付宝,同上
方案二:H5直接调起支付宝,无需上面那串字符串。(前提是你的H5商城已经实现了支付宝支付,也就是说在系统浏览器可以调起支付宝支付)
下面我们说下方案二:
核心代码:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
if (!(url.startsWith(“http”) || url.startsWith(“https”))) {
return true;
}
/**
- 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次
*/
final PayTask task = new PayTask(H5PayDemoActivity.this);
boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {
@Override
public void onPayResult(final H5PayResultModel result) {
final String url = result.getReturnUrl();
if (!TextUtils.isEmpty(url)) {
H5PayDemoActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
view.loadUrl(url);
}
});
}
}
});
/**
-
判断是否成功拦截
-
若成功拦截,则无需继续加载该URL;否则继续加载
*/
if (!isIntercepted) {
view.loadUrl(url);
}
return true;
}
}
mWebView.setWebViewClient(new MyWebViewClient());
这里拦截到H5的支付即可调起支付宝支付,当然也是需要aar包的
这里记得不要修改WebView的userAgent,不然shouldOverrideUrlLoading不会回调,那么自然也不会拦截到了。
这里首先肯定是申请好微信支付功能和商户ID等等信息,然后给到后台配置。
微信和支付宝一样也有2种方式,也可以H5中调起,但是我一直没测成功,修改了refer还是没成功,所以这里只说原生调起微信支付
第一步:导入包依赖
api ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’
第二步:调起微信支付(这些参数后台会返回给客户端)
fun toWechatPay(context: Context, wxPayBean: Pay.WxpayBean) {
val api = WXAPIFactory.createWXAPI(context, wxPayBean.appid)
api.registerApp(wxPayBean.appid)
//这里的bean,是服务器返回的json生成的bean
val payRequest = PayReq()
payRequest.appId = wxPayBean.appid
payRequest.partnerId = wxPayBean.partnerid
payRequest.prepayId = wxPayBean.prepayid
payRequest.packageValue = “Sign=WXPay”//固定值
payRequest.nonceStr = wxPayBean.noncestr
payRequest.timeStamp = wxPayBean.timestamp.toString()
payRequest.sign = wxPayBean.sign
//发起请求,调起微信前去支付
api.sendReq(payRequest)
}
public static class WxpayBean {
private String appid;
private String partnerid;
private String prepayid;
private String noncestr;
private long timestamp;
@SerializedName(“package”)
private String packageX;
private String sign;
}
这样就可以调起支付了,接下来就是支付完成之后的回调了,微信的回调必须在你的项目包名下创建一个包名.wxapi的包名,然后把WXPayEntryActivity放入即可,
微信测试支付参数:
https://wxpay.wxutil.com/pub_v2/app/app_pay.php
这里要注意,如果你是一个包名,然后想通过不同的渠道去打包多个不同的APP,那么可以在AndroidManifest中配置一下activity-alias 别名的方式解决,(其他,比如人脸识别,分享等等需要包名一致的都可以通过此方式解决)否则将会收不到回调
如下配置即可(applicationId为build.gradle中的productFlavors的applicationId):
<activity
android:name=“.wxapi.WXPayEntryActivity”
android:exported=“true”
android:launchMode=“singleTop” />
<activity-alias
android:name=“${applicationId}.wxapi.WXPayEntryActivity”
android:exported=“true”
android:targetActivity=“.wxapi.WXPayEntryActivity”/>
下面是回调代码:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
private String app_id = “wx88888888888”;//微信开发后台申请的app_id
设计模式学习笔记
设计模式系列学习视频
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
nb-1714322490223)]
设计模式系列学习视频
[外链图片转存中…(img-xKewfwLi-1714322490223)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!