0
点赞
收藏
分享

微信扫一扫

Android App整合微信支付


文章目录

  • ​​APP支付​​
  • ​​H5支付​​

Android App整合微信支付有两种方式:
1、移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式(建议)
2、使用webview打开h5微信支付(不建议)

APP支付

APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式

首先根据教程操作,申请微信支付:​​微信APP支付接入商户服务中心​​​ 然后查看​​微信支付官方文档​​

开始了

1、build.gradle 增加依赖

//包含统计功能
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:5.4.0'
//不包含统计功能
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.4.0'

2、AndroidManifest.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"/>

3、创建WXPayEntryActivity
在你的package目录下,创建wxapi目录,在wxapi下创建WXPayEntryActivity
Android App整合微信支付_android

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "WXPayEntryActivity";

private IWXAPI api;
private String app_id = "wxbd9961973f484cf2";//微信开发后台申请的app_id

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//这里可以不填写
// setContentView(R.layout.pay_result);

api = WXAPIFactory.createWXAPI(this, 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) {
}

/**
* 处理结果回调
*
* @param resp
*/
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

switch (resp.errCode) {
case 0://支付成功
Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResp: resp.errCode = 0 支付成功");
break;
case -1://错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
Toast.makeText(this, "支付错误" + resp.errCode, Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResp: resp.errCode = -1 支付错误");
break;
case -2://用户取消,无需处理。发生场景:用户不支付了,点击取消,返回APP。
Log.d(TAG, "onResp: resp.errCode = -2 用户取消");
Toast.makeText(this, "用户取消" + resp.errCode, Toast.LENGTH_SHORT).show();
break;
}
finish();//这里需要关闭该页面
}
}
}

别忘在AndroidManifest中注册

<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>

4、调用API前,需要先向微信注册你的APPID,有两种方式

//*********1,清单文件中直接注册*********
<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" />
<!--这里填写你申请的app id-->
<data android:scheme="wxbd9961973f484cf2" />
</intent-filter>
</activity>

//*********2,在应用入口Application,app id注册到微信*********
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app id 注册到微信 AppID: 申请到的AppID
msgApi.registerApp(AppID);

5、调起微信支付
Android 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

签名,详见​​签名生成算法​​注意:签名方式一定要与统一下单接口使用的一致

/**
* 调支付的方法
* <p>
* 注意: 每次调用微信支付的时候都会校验 appid 、包名 和 应用签名的。 这三个必须保持一致才能够成功调起微信
*/
private void startWechatPay() {
IWXAPI api = WXAPIFactory.createWXAPI(this, null);
api.registerApp(APP_ID);
//以下这些都应该从服务器去获取
PayReq payRequest = new PayReq();
payRequest.appId = APP_ID;//你的微信appid
payRequest.partnerId = "1365026102";//微信支付分配的商户号
payRequest.prepayId = "wx271754067562114fedb5565b1827663000";//微信返回的支付交易会话ID
payRequest.packageValue = "Sign=WXPay";//固定值
payRequest.nonceStr = "rao7iwazsddyvtv3iylhgjldj2ticjcr";//随机字符串
payRequest.timeStamp = "1595843646";//时间戳
payRequest.sign = "D94996F23D4542B277F35756122DEF7C";//签名
//在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
//发起请求,调起微信前去支付
api.sendReq(payRequest);
}

正常情况下就能调起微信支付了
Android App整合微信支付_android_02

H5支付

H5支付主要是在手机、ipad等移动设备中通过浏览器来唤起微信支付的支付产品

官方不建议在App内使用H5支付: ​​H5支付场景介绍​​

如果App内没有集成微信支付相关SDK,为了快速使用微信支付可以使用这个方法,打开网页来调用写好的H5唤起微信支付

在APP内嵌套h5的微信支付流程一般是:
1、app中webview加载h5的商城,选中商品到结算页
2、选择微信支付,点击确认,提交这个订单
3、提交订单后,因为选择了微信支付,会跳转一个页面,url 格式如:​​​https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx30085030634260f39c3a5d9d1583712500&package=3276614634&redirect_url=https://m.mymall.com/respond/front-weixin.html?out_trade_no=20200730085030750475&pay_type=5​

对正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面

4、这个链接又会打开另一个url 格式如:​​weixin://wap/pay?prepayid%3Dwx30085030634260f39c3a5d9d1583712500&package=3276614634&noncestr=1596070231&sign=e4994767cbe6202da7ce3ac95225f82a";​​ 得到这个链接,就能打开微信支付了

那需要我们app端做什么呢?
1、根据 ​​​H5支付常见问题​​中所说的

如果是APP里调起H5支付,需要在webview中手动设置referer,如
Map extraHeaders = new HashMap();
extraHeaders.put(“Referer”, “商户申请H5时提交的授权域名”);

所以我们要做的就是 拦截这个拦截,然后加上 referer 即可

2、因为 webView 只能识别​​http://​​​或​​https://​​​开头的url,如果直接加载步骤4中的 ​​weixin://wap/pay?...​​​这个链接,会报错如下
Android App整合微信支付_微信支付_03
因此我们可以拦截这个链接,让默认浏览器打开

所以我们的webview大致代码如下:

class WebviewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
WebView webView = ((WebView) findViewById(R.id.webview));

WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDefaultTextEncodingName("UTF-8");
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebChromeClient(new WebChromeClient());
WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("weixin://wap/pay?")) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
} else {
Map<String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("Referer", "https://www.baidu.com");
view.loadUrl(url, extraHeaders);
}
return true;
}

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重写此方法可以让webview处理https请求
handler.proceed();
}
};
webView.setWebViewClient(webViewClient);
webView.loadUrl(yoururl);
}
}

举报

相关推荐

0 条评论