android接入支持海外的支付,visa,mastercard

为了支持海外的支付,我真的是找遍了各种方法,研究过google支付,最后因为手续费太高放弃。最后还是找到了支付宝海外支付。

sdk文档地址:http://www.alipay-seller.mpymnt.com/node/82(对,只有英文文档,没有中文)


该渠道支持的visa、mastercard、jcb等信用卡,既然是信用卡支付,是有一定的失败概率的,没有开通国际汇款的信用卡不能支付(这个目前我们应用测试结果是这样子的)。

国内的信用卡不能支付,不管是双币还是其他(这个很忧伤)。我在测试环境测试好后,只能麻烦海外用户帮忙测试。。。

下面我把基本步骤给贴出来,还有一些注意事项。

开发前的准备工作

申请注册webhook  http://www.alipay-seller.mpymnt.com/node/35《--这里有说明

按照文档说,发送申请邮件到指定邮箱,在发之前,最好跟支付宝技术人员先联系上,说明想接入他们这个sdk。否则人家看到你发的邮件都不知道是多久以后了。

webhook的作用:主要是通知我们的服务端,支付结果。


1、选择下载哪个demo

官方网站有三个demo(mCommerce Sample App、CheckoutScreens Sample App、Tokenization Sample),我接入的是第一个,

第二个放入我们工程会报错,第三个支付宝技术人员说不要用(我就想既然建议不要用,为何要有)。





下面我说的,就是按照demo里面的代码该注意的地方重点说明。

下面的这个两个参数,测试环境下就按照官方给的值,不用改。在正式环境中,建议吧这两个值放在服务端。


在测试环境中.初始化initializaProvider(PWProviderMode.TEST,

APPLICATIONIDENTIFIER, PROFILETOKEN);  正式环境中记得改成PWProviderMode.LIVE.


创建订单,


这里我选择的是美元收款,文档里面可以有多种收款币种选择的。最后支付宝会结算成人民币给我们。信用卡类型,我总共就用两个visa和mastercard。两种充值类型逻辑都是一样的,唯一的区别就是这个PWCreditCardType.VISA还是PWCreditCardType.MASTERCARD.根据自己的需求。

创建订单后要选择对订单中哪些数据进行风控。这个风控系统是支付宝自己的系统,主要判断订单的风险性,他们自己有套过滤标准。

这个demo里面绝对没有,除非后面更新了。

这里的美元单位是要美分的


设置订单号:

paymentParams.setCustomIdentifier(orderNum+"");

发起注册预授权(pa)

_binder.createAndRegisterPreauthorizationTransaction(paymentParams);

在回调函数

creationAndRegistrationSucceeded中

发起pa:

_binder.preauthorizeTransaction(transaction);

pa成功后,注册cp:

_binder.createAndRegisterCaptureTransaction(paymentParams, transaction.getMobileIdentifier());


注册cp成功,发起cp:

_binder.captureTransaction(transaction);


完整的java 代码如下:

public class ProcessTransactionActivity extends Activity implements

PWTransactionListener{//,PWTransactionStatusListener 


private PWProviderBinder _binder;

private  String APPLICATIONIDENTIFIER = null;//"payworks.sandbox";

private  String PROFILETOKEN = null;//"20d5a0d5ce1d4501a4826a8b7e159d19";


private ServiceConnection  _serviceConnection = null;

private PWPaymentParams paymentParams = null;

private PWTransaction transaction = null;

private RelativeLayout ry_btn_back,ry_btn_next;

private TextView tv_title,tv_tips;

private EditText edt_name,edt_cardNumber,edt_cvvNumber,edt_mm,edt_yyyy,edt_emailAddress;

private TextView btn_submit;

private Dialog waitDlg;

private RechargeCoinType coinType;

private int fromWhere = 0;

private String orderNum = "0"; //订单号

private String clientIPAddress = ""; //客户端的ip地址

private boolean isOperating = false;

private int clickPayWay = 0;

private final static int aplipayClientPay = 1;

private final static int aplipayWebPay = 2;

private final static int visaPay = 3;

private final static int masterCardPay = 4;

private TextView textTips;


private void setStatusText(final String string) {

runOnUiThread(new Runnable() {

public void run() {

if (textTips == null) {

textTips = ((TextView) findViewById(R.id.textView1));

}

textTips.setText(string);

}

});

}


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_processtransaction);

Bundle bundle = this.getIntent().getExtras();

if (bundle != null) {

fromWhere = bundle.getInt("fromWhere");

PROFILETOKEN = bundle.getString("profiletoken");//可以根据自己的设计获取

APPLICATIONIDENTIFIER = bundle.getString("applicationidentifier");//可以根据自己的设计获取

orderNum = bundle.getString("ordernum");

clientIPAddress = bundle.getString("clientIPAddress");

clickPayWay = bundle.getInt("clickPayWay");

}


if (clickPayWay == visaPay) {

clickKey = "visa";

} else if (clickPayWay == masterCardPay) {

clickKey = "matercard";

}

if (PROFILETOKEN == null || APPLICATIONIDENTIFIER == null) {

finish();

return;

}

initServiceConnection();

startService(new Intent(this, com.mobile.connect.service.PWConnectService.class));

bindService(new Intent(this, com.mobile.connect.service.PWConnectService.class),

_serviceConnection, Context.BIND_AUTO_CREATE);


initView();

setListener();

}

private void showDialog(String str) {

closeDialog();

waitDlg  = DialogUtil.loadingDlg(this, str);

}

private void closeDialog() {

if (waitDlg != null && !this.isFinishing()) {

waitDlg.cancel();

waitDlg = null;

}

}

private void initView() {

ry_btn_back = (RelativeLayout) findViewById(R.id.ry_btn_back);

ry_btn_next = (RelativeLayout) findViewById(R.id.ry_btn_next);

ry_btn_next.setVisibility(View.GONE);

tv_title = (TextView)findViewById(R.id.tv_title);

if (clickPayWay == visaPay) {

tv_title.setText(R.string.recharge_visa_pay);

} else if (clickPayWay == masterCardPay) {

tv_title.setText(R.string.recharge_mastercard_pay);

}

edt_name = (EditText) findViewById(R.id.edt_name);

edt_cardNumber = (EditText) findViewById(R.id.edt_cardNumber);

edt_cvvNumber = (EditText) findViewById(R.id.edt_cvvNumber);

edt_mm = (EditText) findViewById(R.id.edt_mm);

edt_yyyy = (EditText) findViewById(R.id.edt_yyyy);

edt_emailAddress = (EditText) findViewById(R.id.edt_emailAddress);

btn_submit= (TextView) findViewById(R.id.btn_submit);

tv_tips = (TextView) findViewById(R.id.tv_tips);

tv_tips.setText(getString(R.string.pay_charge_choose) + coinType.money + getString(R.string.dollar) + coinType.coinNum + getString(R.string.cointype));

}

private void setListener() {

btn_submit.setOnClickListener(new OnClickListener() {


@Override

public void onClick(View v) {

if (!LocalUsers.isAleadyLogin()) {

ShowUtil.showToast(ProcessTransactionActivity.this, R.string.login_first);

return;

}

submitToAlipay();

}


});

}

private void initServiceConnection() {

_serviceConnection = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

_binder = (PWProviderBinder) service;

// we have a connection to the service

try {

_binder.initializeProvider(PWProviderMode.LIVE, APPLICATIONIDENTIFIER, PROFILETOKEN);

_binder.addTransactionListener(ProcessTransactionActivity.this);

} catch (PWException ee) {

setStatusText(getString(R.string.provider_not_init));

// error initializing the provider

ee.printStackTrace();

}

}


@Override

public void onServiceDisconnected(ComponentName name) {

_binder = null;

}

};

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

// getMenuInflater().inflate(R.menu.activity_tokenization, menu);

return true;

}


@Override

protected void onDestroy() {

super.onDestroy();


unbindService(_serviceConnection);

stopService(new Intent(this,

com.mobile.connect.service.PWConnectService.class));

}


@Override

public void creationAndRegistrationFailed(PWTransaction transaction,PWError error) {

this.transaction = transaction;

isOperating = false;

closeDialog();

String errorDetail = error.getErrorMessage();

if (errorDetail.contains("000.400.100")) {

errorDetail = "交易失敗,訂單進入風控系統,不會發生扣款,如果收到扣款短信,請以您的信用卡賬單為準,有問題聯系客服";

setStatusText(errorDetail + 

"(errorcode:" + error.getErrorCode() + 

",error:" + error.getErrorMessage() + ")");

} else {

setStatusText(getString(R.string.creationAndRegistrationFailed) + 

",errorcode:" + error.getErrorCode() + 

",error:" + error.getErrorMessage());

}

MyLog.e("TokenizationActivity",

error.getErrorMessage());

}


int isPro = 0;//0发起pa,1发起cp

@Override

public void creationAndRegistrationSucceeded(PWTransaction transaction) {

this.transaction = transaction;

isOperating = true;

closeDialog();

mHandler.sendEmptyMessage(101);

try {

if (isPro == 0) {

_binder.preauthorizeTransaction(transaction);

} else if (isPro == 1) {

_binder.captureTransaction(transaction);

}

} catch (PWException e) {

setStatusText(getString(R.string.transactionFailed));

e.printStackTrace();

}

}


@Override

public void transactionFailed(PWTransaction arg0, PWError error) {

this.transaction = arg0;

isOperating = false;

closeDialog();

setStatusText(getString(R.string.transactionFailed) + 

",errorcode:" + error.getErrorCode() + 

",error:" + error.getErrorMessage());


MyLog.e("TokenizationActivity", "isPro" + isPro

error.getErrorMessage());

}


@Override

public void transactionSucceeded(PWTransaction transaction) {

this.transaction = transaction;

try {

if (isPro == 0) {

isOperating = true;

try {

_binder.checkTransactionStatus(transaction.getMobileIdentifier());

} catch (PWException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

_binder.createAndRegisterCaptureTransaction(paymentParams, transaction.getMobileIdentifier());

isPro = 1;

} else {

isOperating = false;

isPro = 0;

closeDialog();

setStatusText(getString(R.string.recharge_finish));

mHandler.sendEmptyMessage(102);

}

} catch (PWException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private Handler mHandler = new Handler(){


@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

switch(msg.what) {

case 100:

showDialog(getString(R.string.Preparing));

break;

case 101:

showDialog(getString(R.string.Processing));

break;

case 102:

ShowUtil.showToast(ProcessTransactionActivity.this, R.string.recharge_finish);

finish();

break;

}

}

};

private void submitToAlipay() {

if (coinType == null) {

return;

}

String holder = edt_name.getText().toString();

String cardnumber = edt_cardNumber.getText().toString();

String cvv = edt_cvvNumber.getText().toString();

String month = edt_mm.getText().toString();

String year = edt_yyyy.getText().toString();

String title = orderNum + "_安卓VISA";

if (clickPayWay == visaPay) {

title = orderNum + "_安卓VISA";

} else if (clickPayWay == masterCardPay) {

title = orderNum + "_安卓MASTER";

}

String emailAddress = edt_emailAddress.getText().toString();

if (emailAddress == null || emailAddress.length() <= 0 || !ToolUtil.isEmail(emailAddress)) {

setStatusText(getString(R.string.mail_type_wrong));

return;

}

try {

if (clickPayWay == visaPay) {

paymentParams = _binder.getPaymentParamsFactory()

.createCreditCardPaymentParams(coinType.money,

PWCurrency.US_DOLLAR, title, holder,

PWCreditCardType.VISA, cardnumber, year,

month, cvv);

} else if (clickPayWay == masterCardPay) {

paymentParams = _binder.getPaymentParamsFactory()

.createCreditCardPaymentParams(coinType.money,

PWCurrency.US_DOLLAR, title, holder,

PWCreditCardType.MASTERCARD, cardnumber, year,month, cvv);

}

if (paymentParams != null) {

paymentParams.addCriterion("CRITERION.ALIRISK_orderNo", orderNum+"");//订单号

paymentParams.addCriterion("CRITERION.ALIRISK_item1ItemProductName", "coins");//商品名称

paymentParams.addCriterion("CRITERION.ALIRISK_item1ItemQuantity", "1");//商品数量

paymentParams.addCriterion("CRITERION.ALIRISK_item1ItemUnitPrice", coinType.money*100 + "");//商品单价

paymentParams.addCriterion("CRITERION.ALIRISK_item1ItemUnitPriceCurrency", "US_DOLLAR");//币种

paymentParams.addCriterion("CRITERION.ALIRISK_txnAmount", coinType.money*100 + "");//订单总金额

paymentParams.addCriterion("CRITERION.ALIRISK_txnCurrency", "US_DOLLAR");//订单总金额币种

paymentParams.addCriterion("CRITERION.ALIRISK_billToEmail", emailAddress);//账单邮箱地址

paymentParams.setCustomIdentifier(orderNum+""); //customid

if (clientIPAddress != null && clientIPAddress.length() > 0) {

paymentParams.addCriterion("CRITERION.ALIRISK_clientIP", clientIPAddress);//客户端的ip地址

}

}

} catch (PWProviderNotInitializedException e) {

setStatusText(getString(R.string.provider_not_init));

e.printStackTrace();

return;

} catch (PWException e) {

int errorCode = e.getError().getErrorCode();

int str = R.string.invalid_parameters;

if (errorCode == 1111) { //卡号填写有误

str = R.string.invalid_parameters_accountname;

} else if (errorCode == 1112) { //持卡人姓名填写有误

str = R.string.invalid_parameters_username;

} else if (errorCode == 1122) { //到期月份填写有误

str = R.string.invalid_parameters_mm;

} else if (errorCode == 1123) { //到期年份填写有误

str = R.string.invalid_parameters_yyyy;

} else if (errorCode == 1124) { //cvv填写错误

str = R.string.invalid_parameters_cvv;

}

setStatusText(getString(str));

e.printStackTrace();

return;

}

ToolUtil.closeKeyBoard(ProcessTransactionActivity.this);

setStatusText("");

mHandler.sendEmptyMessage(100);

try {

//发起pa

_binder.createAndRegisterPreauthorizationTransaction(paymentParams);

} catch (PWException e) {

setStatusText(getString(R.string.cant_contact_gateway));

e.printStackTrace();

}

}


@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

// TODO Auto-generated method stub

if ((keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)) {

if (isOperating) {

ShowUtil.showToast(ProcessTransactionActivity.this, R.string.Processing_notClose);

finish();

}

}

return super.onKeyDown(keyCode, event);

}



下面讲讲服务端的处理的时候注意事项(.net)

服务端测试的通知回调地址是:https://test.payworks.io

服务端正式的通知回调地址是:https://api.payworks.io

服务端需要有ssl证书的,我测试的时候没有ssl证书,有时候会出现因为这个失败

下面是我们服务端的主要代码

  /// <summary>
        /// 验证外卡支付订单并给予充值金币
        /// </summary>
        /// <param name="customIdentifier">自己系统的订单Id</param>
        /// <param name="identifier">EventId</param>
        /// <param name="tid">transactionId</param>
        public static void NewMethod(string customIdentifier, string identifier, string tid)
        {
            if (!string.IsNullOrWhiteSpace(identifier) && !string.IsNullOrWhiteSpace(tid))
            {
                LogHelper.Record("Mpymnt==>identifier:" + identifier + ",,,,tid:" + tid);


                string url = "https://api.payworks.io/events/" + identifier;//正式的验证地址


                string heads = "payworks-apiIdentifier apiIdentifier=" + MpymntConfig.APIIdentifier + ",apiSecretKey=" + MpymntConfig.Key; //MpymntConfig.APIIdentifier和MpymntConfig.Key需要支付宝配置的


                string Trade_no = identifier + "," + tid;


                var info = HttpGetMpy(url, "", heads, "yanzheng", int.Parse(customIdentifier), Trade_no);


                LogHelper.Record("Mpymnt==>去验证获得==>info:" + info);




                if (!string.IsNullOrWhiteSpace(info))
                {
                    MpymntCheckModel infomodel = HttpUtil.ParseJson<MpymntCheckModel>(info);
                    if (infomodel != null)
                    {
                        string out_trade_no = customIdentifier;


                        decimal total_fee = infomodel.data.transaction.amount;  //订单金额
//如果是成功的时候,去加金币
                        if (infomodel.status == "ok" && infomodel.data.transaction.transactionType.ToLower() == "cp")
                        {


                            // LogHelper.Record("Mpymnt==>subject:" + subject + ",,out_trade_no:" + out_trade_no + ",,total_fee:" + total_fee);


                            var row = OrdersBll.Da.UpdateState(int.Parse(out_trade_no), "订单完成", (int)OrdersStatecDescType.SuccessOrder, Trade_no);
                            if (row > 0) //成功更改表 状态 step=2
                            {
                                Core.LogResult("【外卡支付】【时间:】" + DateTime.Now.ToString() + "【交易金额:】" + total_fee + "【订单编号:】" + out_trade_no + ",外卡订单号:【" + tid + "】EventId:" + identifier + "【备注:】--交易成功--");
                            }
                            else
                            {
                                if (row == -25)
                                {
                                    Core.LogResult("【外卡支付】【时间:】" + DateTime.Now.ToString() + "||欢唱订单号:【" + out_trade_no + "】,外卡订单号:【" + tid + "】EventId:" + identifier + ",交易状态:【" + infomodel.status + "】【交易金额:】" + total_fee + "--支付重复");
                                }
                                else
                                {
                                    Core.LogResult("【外卡支付】【时间:】" + DateTime.Now.ToString() + "||欢唱订单号:【" + out_trade_no + "】,外卡订单号:【" + tid + "】EventId:" + identifier + ",交易状态:【" + infomodel.status + "】【交易金额:】" + total_fee + "--支付成功 ,给用户加币失败");
                                    OrdersBll.Da.UpdateState(int.Parse(out_trade_no), "支付成功,加币失败", (int)OrdersStatecDescType.AddCoinError, Trade_no);
                                }
                            }
                        }
                        else
                        {
                            Core.LogResult("【外卡支付】【时间:】" + DateTime.Now.ToString() + "||欢唱订单号:【" + customIdentifier + "】,外卡订单号:【" + tid + "】EventId:" + identifier + ",交易状态:【" + infomodel.status + "】 infomodel.status:" + infomodel.status + ",,transactionType(CP才加):" + infomodel.data.transaction.transactionType.ToLower());


                            // RefundOrders(int.Parse(out_trade_no), tid);


                        }
                    }
                    else
                    {
                        Core.LogResult("【外卡支付】【时间:】" + DateTime.Now.ToString() + "||欢唱订单号:【" + customIdentifier + "】,外卡订单号:【" + tid + "】EventId:" + identifier + " --外卡验证请求链接返回格式Info为Json,Model为NULL。");
                        OrdersBll.Da.UpdateState(int.Parse(customIdentifier), "外卡验证请求格式Json为NULL", (int)OrdersStatecDescType.CheckMpymntError, Trade_no);


                    }
                }
                else
                {
                    LogHelper.Record("Mpymnt==>验证identifier返回的信息空。");
                }


            }
            else
            {
                LogHelper.Record("Mpymnt==>POST过来的Json解析值为空。identifier:" + identifier + ",,,,tid:" + tid);
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38500.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银联支付接口申请-手机控件支付

前一段时间在帮公司申请各种支付接口&#xff0c;在银联支付接口消耗了不少时间&#xff0c;其实银联支付申请还是比较简单的&#xff08;不用上传app截图什么的&#xff09;&#xff0c;只是申请入口比较难找&#xff0c;还有填写的资料比较多。下面我给大家介绍下银联支付接口…

Android-银联支付开发

转自&#xff1a;http://blog.csdn.net/qq285016127/article/details/38435585 银联支付也是一般比较常用的支付功能,这里简单了介绍android app如果短期快速应用这一方面的东西。直接上代码&#xff1a; 1.导入银联支付的依赖包: 2.在res目录下增加资源包: 3.配置AndroidManif…

西米支付:支付宝/微信支付/银联支付通道的接入介绍

本文以电脑网站支付为例&#xff0c;着重对第三方支付通道的接入进行了分析&#xff0c;包括支付宝支付接入、微信支付接入及银联支付接入。 1、支付宝支付接入 支付宝支付能力主要有当面付、刷脸付、App支付、手机网站支付、电脑网站支付和花呗分期等&#xff0c;本文采用电脑…

网关支付、银联代扣通道、快捷支付、银行卡支付等网上常见支付方式接口说明

一、网关支付 这是在线支付的最普遍形式。 大致支付过程&#xff1a;第三方支付公司作为代理&#xff08;网关&#xff09;&#xff0c;接入一堆银行。用户在网关页面&#xff08;可以在商户端&#xff0c;也可以第三方支付平台端&#xff09;选择银行&#xff0c;页面跳转到第…

HTB soccer

title: HTB_soccer description: HTB靶机 难度&#xff1a;easy date: 2023-05-31 categories: [渗透,靶机] HTB soccer 如果图片转载有问题移步&#xff1a;https://qing3feng.github.io/2023/05/31/HTB%20soccer/ 信息收集 ┌──(kali㉿kali)-[~] └─$ sudo nmap --min…

提高WhatsApp营销效果(1):文案篇

// 综述 在WhatsApp上做营销&#xff0c;最主要有四个因素会影响到转化的效果 分别是&#xff1a; ■ WhatsApp的发送者 ■ 文案 ■ 投放时段 ■ 目标号码 对于发送者来讲&#xff0c;主要影响因素是发送者所在的国家、头像和昵称。 投放时段来讲&#xff0c;自然是在用…

港联证券|半导体接棒AI走强 科创50指数领涨

周四&#xff0c;A股三大指数大幅低开&#xff0c;随后反弹并环绕上一买卖日收盘指数打开震动。沪指收报五连阳&#xff0c;半导体概念股团体大涨带动科创50指数走强&#xff0c;4月以来科创50指数已涨超6%。CPO概念股继续活泼&#xff0c;贵金属板块涨幅居前&#xff0c;AI使用…

【汇正财经】沪深创集体红盘,算力股全线爆发

盘面回顾&#xff1a; 大盘日K线收星涨0.31%&#xff0c;深成指涨0.61%&#xff0c;创业板冲高翻绿再弹起&#xff0c;收盘涨0.2%。CPO概念股午后继续大涨&#xff0c;算力概念股全线爆发&#xff0c;AI芯片、ChatGPT概念、电商概念等科技板块交投活跃&#xff0c;酒店餐饮、钙…

微信小程序会员卡开发跳坑

看了一下文档&#xff0c;大概是这样一个函数&#xff0c;可以让用户领取会员卡 wx.navigateToMiniProgram({appId: wxeb490c6f9b154ef9, //固定为此 appid&#xff0c;不可改动extraData: data, // 包括 encrypt_card_id, outer_str, biz三个字段&#xff0c;须从 step3 中获…

使用uni-app生成微信小程序踩的坑

毕设要求写一个浏览器端&#xff0c;一个APP端&#xff0c;一个微信端&#xff0c;刚开始以为要学三个技术然后写三个客户端&#xff0c;后来知道了uni-app这个神器&#xff0c;一次编写就可以编译生成APP、H5以及各种小程序版本的客户端。然而我比较熟悉的是web的前端开发&…

uni-app APP端-微信登录流程

uni-app APP端-微信登录流程 手把手教学 1.前期准备 在微信开放平台注册账户 微信开放平台 (qq.com)在管理中心中创建移动应用项目&#xff0c;按要求填写相关信息审核通过后即可获得我们所需的 AppID和AppSecret然后才uniapp项目中填写&#xff0c;在manifest.json中的App模…

微信小程序开发笔记 进阶篇②——多个微信小程序一个用户体系,同一个UnionID

目录 一、前言二、微信开放平台绑定小程序三、微信小程序login和getUserInfo四、后台请求auth.code2Session五、后台解密开放数据 一、前言 微信小程序开发笔记——导读 二、微信开放平台绑定小程序 微信官方文档&#xff1a;UnionID 机制说明 我们目前有一个微信开放平台&am…

微信小程序登录,包括uniapp的微信小程序登录

代码&#xff1a; 样式&#xff1a; <button click"login">登入</button> 事件&#xff08;methods中&#xff09;&#xff1a; login() {//判断缓存中是否有用户数据&#xff08;也就是判断有没有登录&#xff09;if (!uni.getStorageSync(encrypte…

桔子拓客是什么?

桔子拓客软件是一款安装在手机上APP智能营销软件&#xff0c;启动软件后可不停的活跃帐号&#xff0c;推送作品给指定的人群&#xff0c;指定区域&#xff0c;以此来达到精准曝光&#xff0c;定向引流&#xff0c;帮助用户实现流量的暴增&#xff01; 桔子拓客软件采用非入侵式…

做一个和瑞幸咖啡一样的小程序,就能3月赚24亿了吗?

2017年我开了一家咖啡店&#xff0c;疫情之前门店生意还比较惬意和滋润&#xff0c;没想到这疫情突如其来&#xff0c;一度要关门大吉。 后来偶然间看到瑞幸咖啡的年度报表&#xff0c;还有5月24日&#xff0c;瑞幸咖啡公布了2022年第一季度业绩&#xff0c;总净收入为24.046亿…

揭秘爆款的小程序,为何一黑到底

文章目录 前言⛳️ 1.什么是小程序?⛳️ 2.小程序发展史⛳️ 3.小程序原理⛳️ 4.如何开发微信小程序⛳️ 5.小程序的学习资源⛳️ 6.第一个微信小程序 前言 小程序&#xff0c;由于其便捷的操作&#xff0c;以及丰富的功能&#xff0c;已经普及到了生活中的各个领域,有很多人…

开始第一个基于uni-app的微信小程序开发

微信小程序 uni-app开发工具创建uni-app项目运行项目页面显示以及调试 uni-app uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#…

微信小程序开发大坑盘点

微信小程序开发大坑盘点 起因 前几天心血来潮&#xff0c;想给学校设计个一站式校园小程序&#xff0c;可以查询成绩&#xff0c;考试信息&#xff0c;课表之类的&#xff08;本来想法里是还想包括一些社交功能的&#xff0c;但这个因为资质问题暂且搁置了&#xff09;。其实…

那些年我们在微信小程序遇到的坑

前言 本篇主要记录一下我在开发中遇到的小程序的坑&#xff0c;还有实现的功能。 避坑 坑一&#xff1a;开发工具配置 &#xff08;1&#xff09;控制台如果报proxy代理相关错误&#xff0c;先检查左上角菜单栏中设置>代理设置>使用系统代理 &#xff08;2&#xff09…

使用uniapp微信公众号和小程序踩坑全过程

什么是微信公众号&#xff1f;它的本质是什么 什么是微信公众号 微信公众平台&#xff0c;简称公众号。曾命名为“官号平台”、“媒体平台”、微信公众号&#xff0c;最终定位为“公众平台”。 微信公众号包含了&#xff1a;订阅号&#xff0c;服务号和企业号&#xff0c;各…