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整合微信支付_第1张图片

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 签名,详见签名生成算法注意:签名方式一定要与统一下单接口使用的一致
/**
     * 调支付的方法
     * 

* 注意: 每次调用微信支付的时候都会校验 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整合微信支付_第2张图片

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整合微信支付_第3张图片
因此我们可以拦截这个链接,让默认浏览器打开

所以我们的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);
    }
}

你可能感兴趣的:(Android从入门到放弃,微信支付,android)